C++学习笔记——006

  • 事实上,任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。因此,下面所有的输出语句都是等效的:
cout << "I'd give my right arm to be" " a great violinist.\n";
cout << "I'd give my right arm to be a great violinist.\n";
cout << "I'd give my right ar"
"m to be a great violinist.\n";

 

注意,拼接时不会在被连接的字符串之间添加空格,第二个字符串的第一个字符将紧跟在第一个字符串的最后一个字符(不考虑\0)后面。第一个字符串中的\0字符将被第二个字符串的第一个字符取代。

 

  • strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。另外,strlen()只计算可见的字符,而不把空字符计算在内。

 

  • istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。

 

  • 为什么要使用get(),而不是getline()呢?首先,老式实现没有getline()。其次,get()使输入更仔细。例如,假设用get()将一行读入数组中。如何知道停止读取的原因是由于已经读取了整行,而不是由于数组已填满呢?查看下一个输入字符,如果是换行符,说明已读取了整行;否则,说明该行中还有其他输入。总之,getline()使用起来简单一些,但get()使得检查错误更简单些。可以用其中的任何一个来读取一行输入:只是应该知道,它们的行为稍有不同。

 

  • C++11新增的另一种类型是原始(raw)字符串。在原始字符串中,字符表示的就是自己,例如,序列\n不表示换行符,而表示两个常规字符——斜杠和n,因此在屏幕上显示时,将显示这两个字符。另一个例子是,可在字符串中使用",而无需像其他程序中那样使用繁琐的\"。当然,既然可在字符串字面量包含",就不能再使用它来表示字符串的开头和末尾。因此,原始字符串将"(和)"用作定界符,并使用前缀R来标识原始字符串:
cout << R"(Jim "King" Tutt uses "\n" instead of endl.)" << '\n';

上述代码将显示如下内容:

Jim "King" Tutt uses "\n" instead of endl.

 

  • 输入原始字符串时,按回车键不仅会移到下一行,还将在原始字符串中添加回车字符。

 

  • 如果要在原始字符串中包含)",该如何办呢?编译器见到第一个)"时,会不会认为字符串到此结束?会的。但原始字符串语法允许您在表示字符串开头的"和(之间添加其他字符,这意味着表示字符串结尾的"和)之间也必须包含这些字符。因此,使用R"+*(标识原始字符串的开头时,必须用)+*"标识原始字符串的结尾。因此,下面的语句:
cout << R"+*("(Who wouldn't?)", she whispered.)+*" << endl;

将显示如下内容:

"(Who wouldn't?)", she whispered.

 

总之,这使用"+*(和)+*"替代了默认定界符"(和)"。自定义定界符时,在默认定界符之间添加任意数量的基本字符,但空格、左括号、右括号、斜杠和控制字符(如制表符和换行符)除外。

 

  • 可将前缀R与其他字符串前缀结合使用,以标识wchar_t等类型的原始字符串。可将R放在前面,也可将其放在后面,如Ru、UR等。

 

  • 如果结构初始化的大括号内未包含任何东西,则各个成员都将被设置为0,数值类型的变量均被设置为0,字符类型的变量每个字节都被设置为0。

 

  • 共用体的长度为其最大成员的长度。共用体的用途之一是,当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。例如,假设管理一个小商品目录,其中有一些商品的ID为整数,而另一些的ID为字符串。在这种情况下就可以使用共用体。共用体常用于(但并非只能用于)节省内存。当前,系统的内存多达数GB甚至数TB,好像没有必要节省内存,但并非所有的C++程序都是为这样的系统编写的。C++还用于嵌入式系统编程,如控制烤箱、MP3播放器或火星漫步者的处理器。对这些应用程序来说,内存可能非常宝贵。另外,共用体常用于操作系统数据结构或硬件数据结构。

 

  • 枚举量是整型,可被提升为int类型,但int类型不能自动转换为枚举类型。

 

  • 在C++早期的版本中,只能将int值(或提升为int的值)赋给枚举量,但这种限制取消了,因此可以使用long甚至long long类型的值。

 

  • 顺便说一句,*运算符两边的空格是可选的。传统上,C程序员使用这种格式: int *ptr;这强调*ptr是一个int类型的值。而很多C++程序员使用这种格式: int* ptr;这强调的是:int*是一种类型——指向int的指针。在哪里添加空格对于编译器来说没有任何区别,您甚至可以这样做: int*ptr;但要知道的是,下面的声明创建一个指针(p1)和一个int变量(p2): int* p1, p2;对每个指针变量名,都需要使用一个*。

 

  • 在C++中,int*是一种复合类型,是指向int的指针。

 

  • 警告:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。

扫码关注公众号,查看更多精彩内容

posted @ 2024-03-29 08:55  不是公子的小白  阅读(1)  评论(0编辑  收藏  举报