MyMSDN

MyMSDN记录开发新知道

C++ notes (2)

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)查找更多

posted on 2008-12-20 15:50 volnet 阅读(1747) 评论(0)  编辑 收藏 引用 所属分类: C++ Primer 学习笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


特殊功能