0.感觉essential C++真的不错,至少很适合我这种看不下长篇大论的人= - =而且叙事顺序也很清晰,比起primer和primer plus的介绍顺序能更快给我一个对西佳佳大致的概念。
书真的是越精简越好.
1.类模版
对于函数内容几乎相同,只是形参类型不同的函数,可以定义一个函数模版(function template).但要事先知道可能会使用的形参类型,即template不能针对未知类型.
定义:
//define a compare template // implement strcmp-like generic compare function // returns 0 if the values are equal, 1 if v1 is larger, -1 if v1 is smaller template <typename T> int compare(const T &v1, const T &v2)//<>内是模板形参表,该表不可为空! { if (v1 < v2) return -1; if (v2 < v1) return 1; return 0; }
调用:
int main() { //I suppose T is int. //now call the compare template cout<<compare(1,0)<<endl; //now T is string. //call again cout<<compare("cww","isme")<<endl; return 0; }
声明inline模版:
template <typename T> inline T compare(const T&, const T&){}
inline怎么看都不太熟悉(有三次了啊...)大概是不顺眼,暂时别考虑用.
2.泛型编程:
暂时skip.
貌似主要针对template.
3.实现一个class:
class cww { public: …… private: …… }
①member function必须在class主体内进行声明,但可不同时进行定义.
在class内定义的即自动视为inline函数,在其之外定义的,要在头文件中指定关键词inline.
如对于某Cww类中bool empty()和bool pop()函数,要在class Cww外定义它:
inline: inline bool Cww::empty(){……} bool Cww:pop(string &elem){……}
上述中,Cww::empty()是在告诉compiler,empty()是Cww class的一个member.
4.Constructors(构造)和Destructors(析构):
Constructors的函数名称必须与class相同,且不应返回型别,亦不需要返回值,可以重载.
举个栗子:
//define a class //设定元素个数、起始位置、 class Triangular { public: …… private: int _length; int _beg_pos; int _next; } //对Triangular进行重载构造: class Triangular { //一组重载的构造函数: public: Triangular(); Triangular(int len); Triangular(int len,int beg_pos); //…… }
当调用这些重载函数时,编译器会根据获得的参数来确定被调用的函数.
*当代码为:
Triangular t=8;
意为获取一个参数而非是赋值操作.
以最简单的无参函数Triangular()为例,它的内容可以有两种情况:
//1st,它不接受任何参数 Triangular::Triangular() { _length=1; _beg_pos=1; _next=0; } //2nd,它为每个参数提供默认值 class Triangular { //…… public: Triangular(int len=1,int bp=1); //…… } Triangular::Triangular(int len,int bp) { _length=len>0?len:1; _beg_pos=bp>0?bp:1; _next=_beg_pos-1; }
Constructor还有第二种初始化方法,那就是member initialization list:
Triangular::Triangular(const Triangular &rhs) :_length(rhs._length), _beg_pos(rhs._beg_pos), _next(rhs._beg_pos-1) {}//{}内就是空的.
初始值放在member后的()内.
现在暂不需考虑一二两种初始化方法的优先性.
接下来学习destructor:
Destructor用来释放在constructor中或对象生命周期中配置的资源.
名称规定:‘~‘加上class名称.如在去Qt中:
MainWindow::~MainWindow() { }
Destructor并非绝对必要.根据情况而定,比如Triangular就并没有什么好释放的.
事实上,C++最难的部分之一,就是了解何时需要定义destructor而何时不需要.
(既然这样也暂时没我的事了,不用为妙= - =)
ps:rhs=运算符右边的操作数,同理lhs=运算符左边的操作数.
5.Mutable(可变)和const:
如下,要保证获取的参数train在整个sum()中不被改变,以防sun()所调用的任何一个函数时更改了train的值,因此用到const.
int sum(const Triangular &train){ }
这个貌似是必须加的哦,否则会被compiler警告(报错/总之是不接受的).
mutable暂时skip.我想也用不着.
6.this指针
【明天继续=-=】