1.构造函数
class Widget
{
public:
Widget(); //default构造函数
Widget(const Widget &rhs); //copy构造函数
Widget& operator=(const Widget &rhs); //copy assignment(赋值)构造函数
......
};
Widget w1; //调用default构造函数
Widget w2(w1); //调用copy构造函数
w1=w2; //调用copy assignemnt (赋值)函数
Widget w3=w2; //调用copy构造函数
copy构造函数被用来“以同型对象初始化自我对象”,copy assignemnt操作符被用来“从另一个同型对象中拷贝其值到自我对象”;但使用 “=” 时也有可能调用copy构造函数(见上述代码片段中最后一句),是因为新对象被定义时调用的一定是一个构造函数,而不是复制(assignment)函数
-
在对内置类型(int,double,bool等)传参数时,pass by value比pass by reference更高效。
-
C++是一个语言联邦,具有是个多重范型编程语言,同时支持过程形式(),面向对象形式(),函数形式(),范型形式(),元编程形式()。包含四个次语言C,Object-Oriented C++,template C++,STL;C++高效编程守则视状况而定,取决于使用C++的哪一部分。
对于单纯常量最好以const或者enums代替#define
对于形似函数的宏(macros),最好改用inline代替#define
5.>const
多用const
const char * 和char const * ,都是字符串常量;char * const是指针常量。
const在星号之前是修饰变量,指针所指的区域存储的是一个常量,const在星号之后修饰指针,证明指针自身是常量,如果出现在两边那说明被指物和指针两者都是常量
-
初始化很重要
- 为内置型对象进行初始化,c++编译器不一定会初始化他们
- 构造函数最好使用初始化列表,而不要再构造函数本体内进行赋值操作。成员初始化列表列出的成员变量,其排列次序应该和声明时的顺序一样
- 为免除“跨编译单元之初始化问题”,以local static对象替换non-local static对象。
无论内置类型还是类结构都应该进行初始化
内置类型
在声明的时候就进行初始化
类结构
在调用构造函数之前初始化,注意以下区别
class A
{
public:
int a;
int b;
int c;
A() {};
//这样是赋值不是初始化
过程是先调用默认构造函数A(),但默认构造函数神什么都没有做,也没有初始化
然后再用传进来的参数给成员变量赋值,并不是初始化
A(int a, int b, int c)
{
a=a;
b=b;
c=c;
}
//使用成员初始化列表(member initialization list)是真正的初始化,而且这样比赋值操作要高效的多;过程是,
先使用传进来的参数初始化成员列表,此时已经完成初始化
然后再调用默认构造函数和进行函数体内的操作。
A(int a, int b, int c)
:a(a), b(b), c(c)
{
}
};
在使用初始化列表时,最好按照声明的顺序进行初始化,以防止发生神奇的错误,比如成员变量之间有关系时,就有初始化的次序行;len是数组v的长度,那就必须先初始化数组,再初始化len才是合理的。
网友评论