最近忙里偷闲,阅读以下生日时买的C++ Primer,以前看的第三版,还是在手机上看的,有些不太清楚。正好趁着最近有时间,把这个第六版好好的看一下,借此重温下对于C++的学习。
以下仅对于自己不太熟悉的地方以及未了解的地方加以详解。
1.1头文件的命名约定
头文件类型 | 约定 | 示例 | 说明 |
C++旧式风格 | 以.h结尾 | iostream.h | C++程序可以使用 |
C旧式风格 | 以.h结尾 | math.h | C,C++程序可以使用 |
C++新式风格 | 没有扩展名 | iostream | C++程序使用,使用using namespace std |
转换后的C | 加上前缀C,没有扩展名 | cmath | C++程序可以使用,可以使用不是C的特性,如namespace std |
1.2 使用cout进行C++输出
<span style="font-size:14px;">cout<<string;</span>
对于现实的字符串而言,只需知道这些即可。现在来看看C++如何从概念上解释这个过程。从概念上来看,输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性iostream文件中定义的。cout对象包含一个插入运算符<<,它可以将其右侧的信息插入到流中。
如果熟悉C的,则可能注意到了,插入运算符<<看上去就是按位左移运算符<<,这是一个运算符重载的例子,通过重载,同一个运算符将具有不懂的含义。
1.3 为什么变量必须声明
有些语言在使用新名称是创建新的变量,而不用显示的进行声明。这看上去对用户是十分有好的,事实上从算起上说确实如此。问题是,如果错误的书写变量名,将在不知情的情况下创建了显得变量。如在BASIC语言中,
<span style="font-size:14px;">CastleDark=34
...
CastleDank=CastleDark+MOreGhosts
...
PRINT CastleDark</span>
由于拼写错误而带来的不必要的麻烦,且不容易检查出错误。
1.4 cout的新花样
<span style="font-size:14px;">cout<<carrots;</span>
程序没有打印“carrots”,而是打印存储在carrots中的值,即25.实际上是将这两个操作合二为一了。如上所示,cout可以用于,这似乎没有什么不同寻常的地方,但是别忘了,整数25与字符串"25"的天壤之别。该字符存储的是书写该字符使用的字符整数25被存储为数值,计算机不是单独存储没一个数字,而是将25存储为二进制数。这里的要点是,在打印之前,cout必须将整数形式的数字转化为字符串形式。另外,cout很聪明,知道carrots是一个需要转换的整数。
cout的智能行为源自C++的面向对象的特性。实际上,C++插入运算符<<,将根据其后的数据类型相应的调整它的行为,这是一个操作符重载的例子。
1.5 在多函数程序中使用using编译指令
让程序能够访问名字空间的方式有多种,下面就是其中的四中。
1)将using namespace std; 放在函数定义之前。让文件中所有的函数能够使用名字空间std中的元素。
2)将using namespace std; 放在特定的函数定义中,让该函数能够使用std名字空间中的所有元素。
3)在特定的函数中使用类似using std::cout; 这样的指令,而不是使用using namespace std; ,让该函数能够使用制定的元素,如cout。
4)完全不使用using指令,而在需要使用名字空间std中的元素时,使用前缀std:: ,如下所示
<span style="font-size:14px;">std::cout<<"I'm using cout and endl from the std namespace"<<std::endl;</span>
1.6 运算符sizeof 与头文件limits
sizeof 运算符指出,在使用8位字节的系统中,int的长度为四个字节。可以对类型名或变量名使用sizeof 运算符。对类型名使用此运算符时,应将名称放在括号中,但对变量名使用时,括号是可选的:
<span style="font-size:14px;">cout<<"int is"<<sizeof(int)<<"bytes.\n";
cout<<"short is"<<sizeof short<<"bytes\n";</span>
另外,在头文件climits中定义了符号常量来表示对类型的限制。下表对该文件中定义的符号进行了总结
CHAR_BIT | char的位数 |
CHAR_MAX | char的最大值 |
CHAR_MIN | char的最小值 |
SCHAR_MAX | signed char的最大值 |
SCHAR_MIN | signed char的最小值 |
UCHAR_MAX | unsigned char的最大值 |
SHRT_MAX | short的最大值 |
SHRT_MIN | short的最小值 |
USHRT_MAX | unsigned short的最大值 |
INT_MAX | int的最大值 |
INT_MIN | int的最小值 |
UINT_MAX | unsigned int 的最大值 |
LONG_MAX | long的最大值 |
ULONG_MAX | unsigned long的最大值 |
LLONG_MAX | long long的最大值 |
LLONG_MIN | long long 的最小值 |
ULLONG_MIN | unsigned long的最小值 |
1.7{ }的初始化方式
{ }的初始化方式用于数组和结构体,但在98c++中,也可用于单值变量
<span style="font-size:14px;">int hambergers={24};//set hambergers to 24</span>
将大括号初始化器用于单值变量的情形还不多,但在C++11标准是得这种情形更多了。首先采用这种方式时,可以使用=也可以不使用:
<span style="font-size:14px;">int emue{7};
int reas={12};</span>
其次大括号中可以不包含任何东西。在这种情况下,变量将被初始化为0。
第三,在以前,C++用不同的方式来初始化不同的类型:初始化类变量的方式不同于初始化常规变量的方式,而初始化常规结构的方式又不同于初始化简单变量的方式;通过C++新增的大括号初始化器,初始化常规变量的方式与初始化类变量的方式更像,C++11是得可将大括号初始化器用于任何类型,这是一种通用的初始化语法。
1.8 使用转义字符的一段小代码
<span style="font-size:14px;">#include<iostream>
int main()
{
using namespace std;
cout<<"\aOperation\"HyperHype"is now activated!\n";
cout<<"Enter your agent code:______\b\b\b\b\b\b";
long code;
cin>>code;
cout<<"\aYou erntered "<<code<<"...\n";
cout<<"\aCode verified!Proceed with Plan Z3!\n";
return 0;
}</span>
1.9 为什么main()不能使用其他名称
之所以将程序中的函数命名为main(),原因是必须这样做。通常,C++程序必须包含一个名为main()的函数(且大小写均要正确)。在运行C++程序时,通常从main()函数开始执行。因此没有此函数程序将不完整,编译器将支出未定义该函数。