只有你足够强,别人才会和你讲道理。
文章: 280
浏览: 3,031,644
  • 博主:笨木头
  • 关注:Unity、Net Core、Blazor
  • 邮箱:musicvs@163.com
笨木头  2014-10-29 21:50     其它     阅读(4577)     评论(6)
转载请注明,原文地址: http://www.benmutou.com/archives/1903
文章来源:笨木头与游戏开发
 

今天的标题取得..好严肃的感觉。(小若:咳噗)

 

这章的内容虽然还是很详(lao)细(dao),但已经开始有很多值得记录的内容了~

那么,今天就来初次介绍数组与字符串...以及结构体..还有共用体..吧。

 

 
笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址: http://www.benmutou.com/archives/1903

文章来源:笨木头与游戏开发
 

 

1.数组

我记得大四实习的时候,请教同事:“什么是属主?”(其实是和数据库相关的东西)

然后同事惊讶地说道:“啊,你连数组都不知道..这,基础还是要好好补补...呐,数组的意思呢,是这样的...”

我听着听着就不对劲,“等等,这是数组...其实我是问这个属主...”

然后同事松了一口气,估计心里在想,“唉,吓死我,我以为来了个浑水摸鱼的实习生了”。

 

等等,我好像跑题了。

那么,数组这么简单,我是不可能给大家介绍的了。

随便说说它的声明和初始化吧,如下代码:
[cce_cpp]
// 1.普通人的声明和初始化
int nums[3] = {25, 65, 4};

// 2.只声明 int num[3]; // 这样数组里的元素值是未知的

// 3.只声明,然后赋值 int num[3]; num[0] = 1; num[1] = 34; num[2] = 9;

// 4.文艺青年的初始化 int nums[3] = {89}; // 第0个元素赋值为89,其他默认为0 int nums[3] = {}; // 所有元素的值都为0

// 5.非主流青年的初始化 int nums[] = {1,2,3,4,5}; // 不指定大小,由后面的赋值内容决定数组大小,书上说不推荐,我本人不评价~

// 6.新人类的初始化(C++11) int nums[3] {1, 2, 3}; // 省略了等号 [/cce_cpp]
代码里已经把大部分的情况都列出来了~

关于第3条的第二种,其实也是C++11的新特性。

 

最后,对于第6条这种的话,也是C++11的新东西,我个人不太喜欢~

这可能会让不熟悉C++的人觉得很生疏(比如别人只是迫不得已要看一段C++代码,结果出来了这句,可能会一下子蒙住)。

而其他的形式即使没有学过C++的人也能很轻易地知道这是在定义一个数组。(好吧,随便说说的)

 

2.字符串

字符串有两种,一种是C风格的字符串,另一种是string(可以说是一个类了)

C风格字符串和数组很像,如下代码:
[cce_cpp]
// 1.聪明人的初始化
char name[] = "mutou";

// 2.笨蛋的初始化 char name[6] = "mutou";

// 3.蛇精病的初始化 char name[6] = {'m', 'u', 't', 'o', 'u', '\0'}; [/cce_cpp]
这种风格的字符串就相当于char类型的数组了,但是它需要在最后加一个'\0'作为结束符(学过C的都知道喇)

我想,正常人都会使用第一种方式的(除非特殊情况?我还真不知道),"mutou"称之为字符串常量,后面会自动给数组补上一个'\0'符号的。

 

接着就是string字符串了,使用方式如下:
[cce_cpp]
// 1.先声明,再初始化
std::string name;

name = "mutou";

// 2.声明和初始化 std::string name = "mutou";

// 3.复制其他字符串内容 std::string name1 = "mutou; std::string name2 = "hello";

name1 = name2; // 此时name1为"mutou" name2 = "nihao"; // 此时name2为"nihao",name1仍然为"mutou"

// 4.连接字符串 std::string name = "mutou"; name += "hehe"; [/cce_cpp]
string在头文件string里,所以使用的时候要加上 #include <string>。

并且它属于命名空间std,所以也要加上std::

 

string字符串用起来很舒服,就像是本就该这么用的那种感觉~

如果使用C风格字符串,那么,复制字符串和连接字符串都会变得很麻烦(需要使用strcpy和strcat函数来完成)

 

3.原始字符串

还有一个比较有意思的字符串,叫做原始字符串。

我们都知道,字符串是用双引号来包围的,如果要在字符串中出现其他双引号,就要用转义字符\。

而使用原始字符串就可以避免这种麻烦,如下代码:
[cce_cpp]
std::string name1 = R"("mutou")";
std::string name2 = R"*(("mutou"))*";
std::cout << name1.c_str() << "\n";
std::cout << name2.c_str() << "\n";
[/cce_cpp]
输出结果如下:

"mutou" ("mutou")

使用R开头,再用"()"符号把字符串包围起来,那么,中间的字符串就可以使用双引号等原本需要转义的字符了。

那么,name2字符串又是怎么回事呢?这是为了解决恶性循环的问题——如何在原始字符串里使用额外的 ( 字符呢?

于是,我们可以在"(中间添加一个*号,在)"中间也添加一个*,也就是变成这样:R"*(.....中间很多字符串....)*"

于是就可以在字符串中间使用 ( 等字符了。

其实不一定得加*号,可以加其他东西,而且可以加好几个,随你喜欢,但也有限制,不能加空格、左右括号、斜杠和控制字符。

 

4.结构体

结构体应该算是类的前身吧~

比较简单,不多说了,随便看看:
[cce_cpp]
// 定义
struct BadMan
{
    char name[]; // 也可以使用 std::string name; 但可能有些编译器不支持
    int age;
    long money;
};

// 使用 BadMan man1 = {   "mutou",   18,   99999999 }; man1.money = 88888888;

[/cce_cpp]
好吧,不多说了~

 

5.共用体

人格分裂听过吗?

没听过吧~人格分裂就是好几个人的灵魂存在于同一个身体里,同时只能有一个灵魂在控制身体。(小若:瞎说~!)

 

C++也有这样的东西,那就是共用体,看代码:
[cce_cpp]
    union ManyOne
    {
        int age;
        long money;
        float girl;
    };

  ManyOne mOne;   mOne.age = 25;   std::cout << mOne.age << "\n\n";

  mOne.money = 999990;   std::cout << mOne.age << "\n";   std::cout << mOne.money << "\n";

[/cce_cpp]
输出结果是:

25

999990 999990

共用体和struct很像,唯一有一点区别,那就是,共用体里的属性只能同时存在一个。

比如刚刚的代码,虽然age在之前赋值为25,但是一旦给其他属性赋值,那么age的值将不被保留。

因为他们使用的是同一个空间,这点要记住。

因为共用体的所有属性都是使用一个存储空间的,所以共用体占内存的大小是以需要最大存储空间的成员为准的。

 

也许第一次听说共用体的人会迷糊,其实共用体可以想象成是一个变量有多个名字,我们可以用不同的名字去使用它们。

只不过,这不同的名字有着不相同的类型摆了。

 

6.结束

嗯,这本书实在是太详(lao)细(dao)了,第四章还在继续进行中。(小若:你觉得和你比起来,谁更唠叨?)

 

 

 
6 条评论
  • myweaven 2014-11-11 10:10:58

    1数组代码里面的第九行num = 9;不行吧,应该是num = 9;
    0回复
    • 博主 糟糕_树叶的mut 2014-11-11 10:17:30

      谢谢,写错了~奇怪,评论的[]格式会自动转成图片数字。。。
      0回复
  • 我爱纪录片app 2014-10-30 09:50:19

    我也就大学玩了几年C++,唠叨点好~~
    0回复
    • 博主 糟糕_树叶的mut 2014-10-30 10:12:48

      我大学玩Java的...
      0回复
      • 我爱纪录片app 2014-10-30 10:19:50

        我工作3年都用Java耶!颤抖吧!!
        0回复
        • 博主 糟糕_树叶的mut 2014-10-30 12:22:30

发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发