一,模板类的声明与定义(2017.9.3)
昨天尝试着用模板类把链表重写一下,因为之前基本没写过模板类,所以遇到了一个很多刚写模板类的新手都会遇到的问题:按照非模板代码的组织方式把类和类中的函数在.h头文件中声明,在对应的.cpp文件中定义具体的实现,导致编译的时候报错,所有的函数均报了未声明的错误。
百思不得其解,以为是VS的问题,后面换了codeblocks问题依然存在,最后多方查询才知道原来模板类的声明和定义必须放到一起,不然在main函数中定义的时候会找不到定义。
在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找[当遇到未决符号时它会寄希望于连接器]。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会具现化出来,所以,当编译器只看到模板的声明时,它不能具现化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。然而当实现该模板的.cpp文件中没有用到模板的具现体时,编译器懒得去具现,所以,整个工程的.obj中就找不到一行模板具现体的二进制代码,于是连接器也无法找到对应的地址,导致报“未定义”的错误。
所以,在定义模板类时,声明与定义要一起写到头文件中,不能分开写到.h和,cpp文件中。
具体分析可参考:模板类声明与定义为什么要写到一起
二,运算符的重载说明(2017.9.11)
在面向对象的使用中,经常要用到运算符的重载,运算符重载有两种方式:重载为成员函数或者友元函数。运算符重载有几点规则如下:
1,C++中除了几个不能重载的运算符(成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”),其他的都可以重载。
2,重载后运算符的操作数、优先级、结合性和语法结构均不变。
3,重载为成员函数时,参数比原来的操作数少一,重载为友元函数时,跟原操作数相同。
4,运算符重载的一般形式为:( friend ) 函数类型 operator 运算符 (形参表){ 函数体 }。
5,运算符“=”、“[]”、“()”、“->”等只能重载为成员函数,运算符“<<”、“>>”只能重载为友元函数。
friend inline ostream &operator << (ostream&, A&);//输出流
friend inline istream &operator >> (istream&, A&);//输入流
参考资料:c++运算符重载总结 C++运算符重载讲解与经典实例
三,C++输入输出重定向到文件(2017.9.11)
刷题时有时输入比较复杂或者需要多次输入的话可以选择将输入输出重定向到文件中,省时省力。
在C语言中,比较简单,用freopen()函数:
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
这样就把标准输入重定向到了data.in文件,标准输出重定向到了data.out文件。
C++中,对流重定向有两个重载函数:
streambuf* rdbuf () const;
streambuf* rdbuf (streambuf *)
使用需要包含头文件:#include <fstream>
具体方法如下:
streambuf *readbuf = cin.rdbuf(); // 备份原来的输入,即标准输入
streambuf *writebuf = cout.rdbuf(); // 备份原来的输出,即标准输出
ifstream fin; // 读文件标识符
ofstream fout; // 写文件标识符
string test; // 测试字符串
fin.open("data.in"); // 从data.in文件读
fout.open("data.out"); // 输出到data.out文件
cin.rdbuf(fin.rdbuf()); // 输入重定向
cout.rdbuf(fout.rdbuf()); // 输出重定向
getline(cin, test);
cout << test << "!";
cin.rdbuf(readbuf); // 输入重定向回控制台
cout.rdbuf(writebuf); // 输出重定向回控制台
fin.close(); // 关闭文件
fout.close(); // 关闭文件
四,CSDN-Markdown相关操作(2017.9.11)
首行缩进:在开头的时候,先输入“       ”,然后紧跟着输入文本即可。分号也不要掉。
文字居中:<center>你的内容</center>
缩进:一个字“ ”或“ ";(所以首行缩进也可以通过添加“  ”实现)
半个字“&ensp”或“ ”;
字体字号颜色:<font color=#0099f6 size=3 face="黑体">你的内容</font>
格式相关看这个:使用CSDN Markdown写博客
字体相关看这个:CSDN-markdown编辑器语法——字体、字号与颜色
五,C++多态性理解(2017.9.23)
六,do while(0)的好处(2017.9.23)
do while(0)不是循环语句,实质是一个顺序执行的普通语句,用do while(0)的结构并不是为了美化,有如下几个优点:
1.替代{},实现局部作用域.在一些C的实现里也可以用.
2.避免使用GOTO,用break做跳出.