写这些东西实际上也是一个笔记的作用,希望有所提高。文章不会专注什么C++基本的东西和语法,因为这些东西的资料很多,所以我只写一些自己以前还不知道的东西,以取得一点点的进步。
在此,我也只是以知识点的结构来描述,每个知识点之间没什么关系。
POINT 1, explicit
1. 作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
2. 举例:
class A
{
A(int x = 0, bool b = true); //这里没有用explict修饰,你会看到下面的隐式类型转换
A(double dblValue);
}
void doSomething(A& aObject);
A aObj;
doSomething(aObj); //没问题
doSomething(2); //这个也没有问题,原因是进行了隐式类型转换
//过程如下:编译器知道传的值是int而函数需要的是A类型,但它也同时知道调用A的构造函数将int转换成
//一个合适的A,所以才有上面成功的调用.换句话说,编译器处理这个调用时的情形类似下面这样:
const A temp(2); // 从2产生一个临时A对象
doSomething(temp); // 调用函数
A aObj1 = 1.23; //没问题,被隐式转换了,等价于:A aObj1 = tmp(1.23);
3.建议:能用explict就用,除非有理由允许编译器进行隐式类型转换。
POINT 2, copy construct and copy assignment( = )
每个类都会有默认的构造函数和copy构造函数,如果自己不指定,那么系统就会用默认的。对于系统默认的copy 构造函数来讲,它是pass by value的,完全就是一个hard copy。
所以,如果你的类里面有指针的话,那么一定要重新copy构造函数,不然两个对象用同一个指针,很容易出问题。
而且很容易引起死循环,比如:???
1. 作用:copy construct是为了解决诸如下面的语句:
A aObj;
A a1Obj(aObj);
copy assignment就是operator "=" 赋值操作符,是为了解决如下的语句
A a2Obj;
a2Obj = aObj; //copy assignment
但有一点,单独的"="也有可能调用copy construct函数,比如:
A a3Obj = a2Obj; //copy construct
看起来很难区分吧,其实分辨起来也简单。如果一个新对象被定义,就如上面的a3Obj,肯定会调用copy construct,不可能调用copy assignment。如果没有新对象被定义,比如a2Obj = aObj,当然不会调用copy construct,所以就是copy assignment。
2. 建议:对象传递,不要用pass by value,代价太大,用&
待续...