11、枚举
//enum
enum HttpVerbs { Head, Post, Get, Delete };
HttpVerbs current_verbs = Post;
std::cout<<"Current Verbs = "<<current_verbs<<std::endl;
//error C2440: “=”: 无法从“int”转换为“HttpVerbs”
//current_verbs = 3;
current_verbs = (HttpVerbs)2;
std::cout<<"Current Verbs = "<<current_verbs<<std::endl;
HttpVerbs copy_verbs = current_verbs;
std::cout<<"Copy Verbs = "<<copy_verbs<<std::endl;
HttpVerbs future_verbs = (HttpVerbs)((current_verbs + 1)%sizeof(HttpVerbs));
std::cout<<"Future Verbs = "<<future_verbs<<std::endl;
std::cout<<"HttpVerbs Size![by sizeof(HttpVerbs)] = "<<sizeof(HttpVerbs)<<std::endl;
输出:
Current Verbs = 1
Current Verbs = 2
Copy Verbs = 2
Future Verbs = 3
HttpVerbs Size![by sizeof(HttpVerbs)] = 4
12、类,成员变量初始化
定义变量和定义数据成员存在着非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过成为构造函数的特殊成员函数控制初始化。
class MyClass1
{
public:
int GetMyValue();
void SetMyValue(int value);
private:
//error C2864: “MyClass1::myValue”: 只有静态常量整型数据成员才可以在类中初始化
int myValue = 3; //只需修改为int myValue;即可
};
13、struct关键字
C++支持另一个关键字struct,它也可以定义类类型。struct关键字是从C语言中继承过来的。
如果使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private;如果使用struct关键字,那么这些成员都是public,除非有其他特殊的声明,如添加了private才为private,否则都是public,因此没必要添加public关键字。
用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private。
14、预编译头文件
一、什么是预编译头文件?
预编译头文件物理上与通常的的.obj文件是一样的,但编译入预编译头的.h,.c,.cpp文件在整个编译过程中,只编译一次,如预编译头所涉及的部分不发生改变的话,在随后的编译过程中此部分不重新进行编译。进而大大提高编译速度,并便于对头文件进行管理,也有助于杜绝重复包含问题。
VC++程序一般包含的头文件都比较复杂,如果每次都逐行分析可能会花很多时间,所以VC++默认设置是第一次编译时分析所有头文件,生成.pch文件,这个文件很大,但以后每次编译时就可以节省很多时间。如果删除了这个文件,下次编译时VC++会自动生成它。
二、什么时候使用预编译头?
当大多.c或.cpp文件都需要相同的头文件时。
当某些代码被大量重复使用时。
当导入某些不同库都有实现的函数,并产生混乱时。
15 、在头文件中必须总是使用完全限定的标准库名字。
因为预处理器会将头文件复制到使用它的任何地方,两种可能,一种是如果在头文件中使用using,会使相关代码不论是否需要该using都必将放置一个using,另一种是,假设有另一个库可能也包含了相应的方法如有方法std::cout以及my::cout,如果使用了using,有可能导致被引入的程序偏离原本的使用意图,或者导致编译错误。
16、字符串字面值和标准库string不是同一种类型
因为历史原因以及为了与C语言兼容,字符串字面值与标准库string类型不是同一种类型。这一点很容易引起混乱,编程时一定要注意区分字符串字面值和string数据类型的使用,这很重要。
17、getline函数输入的时候丢弃末尾的换行符,并将整行返回,而且不丢弃第一个换行符,也就是即便你一开始就输入了换行符,它仍然会返回,只不过返回的是一个空字符串而已。
编写程序实现从标准输入每次读取一行文本。然后改写程序,每次读入一个单词!
//std::cout<<"getline:<<std::endl;
WriteLine("getLine");
WriteLine("P72 编);
using std::string;
WriteLine("每(输"NEXT\"进");
string str;
while(std::getline(std::cin, str))
{
if(str == "NEXT")
break;
std::cout<<str<<std::endl;
}
WriteLine("每输"NEXT\"进");
while(std::getline(std::cin, str))
{
if(str == "NEXT")
break;
//从第0个开始查找空白
static const std::basic_string<char>::size_type npos = (std::basic_string<char>::size_type)-1;
std::basic_string<char>::size_type firstIndexOfEmpty = str.find_first_of(" ", 0);
if(firstIndexOfEmpty != npos)
std::cout<<str.substr(0, firstIndexOfEmpty)<<std::endl;
else
std::cout<<str<<endl;
}
其中WriteLine函数:
void WriteLine(std::string str)
{
std::cout<<str<<std::endl;
}
18、std::string对象的加法
如果一串字符串和string对象混合相加,则要求+操作符左右操作数必须至少有一个是string类型的。
推论:一串字符串和string对象混合相加,前两个操作数中至少有一个是string对象。
std::string str2 = str1 + "this" + " that" + " those";
std::cout << str2 << std::endl;
//error C2110: “+”: 不能添加两个指针
std::string str3 = "this" + " that" + str1 + " those";
std::cout << str3 << std::endl;
19、C标准库头文件和C++版本
C++标准库也包括C标准库,命名上则在C标准库的名字前加一个c并省去后缀.h,比如C标准库中的ctype.h,在C++中就有相应的标准库cctype(注意没有.h)。C++和C标准库文件的内容是一样的,只是采用了更适合C++的形式。而且通常cname头文件中定义的名字都定义在命名空间std内,而.h版本的名字却不是这样。
20、关于中文编码的相关问题
我们知道大部分的编译器以及解决方案都由外国人发明创造,特别是美国人。因此很多程序默认不支持中文。虽然随着Unicode的普及这部分问题得到了很大的改善(比如C#就可以完美地支持中文),但是类似C++这样的语言,仍然面临着中文编码的问题。关于编码,有一篇值得推荐的文章:地址1(备用地址)下载后打印(docx,50.7KB)查找更多