
effective-c++
月已满西楼
某不知名学校毕业学生,某不知名名企软件工程师,擅长C++
python,Mysql
展开
-
条款12:复制对象时勿忘其每一部分
复制对象时要把对象的每一部分都赋值到位,尤其在有基类的时候容易遗漏复制 #include<iostream> using namespace std; class Date { public: Date(int d = 1, int m = 1, int w = 1) :day(d), month(m), weekday(w) { cout << "基类构造函数"原创 2017-05-10 20:01:51 · 339 阅读 · 0 评论 -
条款10 令operator=返回一个reference to *this
显而易见 令赋值运算符返回一个引用有利于表达式连续赋值,其他需要连续操作的函数也如此,有一点需要注意,一般重载赋值运算符时,要记得判断是否是自己给自己赋值。原创 2017-05-08 21:16:44 · 334 阅读 · 0 评论 -
条款9:绝不在构造和析构过程中调用virtual函数
先看一段代码#include<iostream> using namespace std; #include<string> class Base { public: Base(int val = 0) { fun(); } ~Base() { cout << "基类析构函数" << endl; } virtu原创 2017-05-08 21:10:43 · 512 阅读 · 0 评论 -
条款7:为多态基类声明virtual析构函数
一般来讲如果基类类对象里如果申请了空间,基类对象的析构函数就应该声明为virtual析构函数,否则容易造成内存泄露。 举个栗子: #include<iostream> using namespace std; class Base { public: Base(){ cout << "base 构造" << endl; } // virtual ~Base(){cout原创 2017-05-08 20:46:59 · 535 阅读 · 0 评论 -
条款6:若不想使用编译器自动生成函数,就该明确拒绝
前面我们已经知道,编译器会默认为我们合成六个成员函数分别是:构造函数、拷贝构造函数、析构函数、赋值运算符重载、取地址运算符重载、const取地址运算符重载。 那么如果我们如果不想要编译器为我们自动生成某些函数(尤其是复制和赋值构造函数)应该怎么办呢? 有一个简单的办法,就是将这个两个函数声明放在private中,而不去定义它们。这样,类的用户无法直接对这个类的对象进行赋值和复制。而且,因原创 2017-05-08 20:24:15 · 685 阅读 · 0 评论 -
effective c++条款5 了解编译器默认编写那些函数
一个空类里面都默认包含那些函数 . 构造函数 · 拷贝构造函数 . 析构函数 . 赋值操作符重载 . 取地址运算符重载 . const取地址运算符 什么条件下编译器不会默认合成赋值操作符重载,和默认构造函数 . 当成员变量包含const成员变量时,因为const成员变量只能被在初始化列表初始化,不能被赋值,所以也不会合成默认构造函数 . 当成员变量包含引用时,因为引用只能引用一个实体原创 2017-05-06 10:20:47 · 415 阅读 · 0 评论 -
条款17以独立语句将new置入智能指针
使用智能指针可以防止内存泄露,但是在使用时也要注意以下问题void func1(){} void func2(tr1::shared_ptr<int> p,void f()){} int main() { func2(tr1::shared_ptr<int> (new int(10)),func1); return 0; } 我们能够确定,编译器会做3件事:原创 2017-05-13 16:57:02 · 421 阅读 · 0 评论 -
条款16:成对使用new和delete时要采取相同的形式
int* parr = new int[5];//分配的是一个数组 delete[] parr; int* pval = new int(5);//分配的是一个变量 delete pval; 与此相伴的一个问题是:如果一个人typedef了一个数组,那么在new和delete时就要小心了:typedef int ARRAY[4]; int* pArray = new ARRAY;原创 2017-05-12 16:41:44 · 438 阅读 · 0 评论 -
条款13:以对象管理资源
我们都知道,当new一个东西之后,必须delete它。但是问题可能出现在在new和delete之间:比如中间出现了异常,或者return之类的。一种比较好的作法是通过对象来管理:因为当对象的声明周期结束以后,会调用析构函数,而在析构函数中delete,这样的作法就靠谱多了。 其实就是使用智能指针原创 2017-05-10 20:12:47 · 380 阅读 · 0 评论 -
条款18:让接口容易被正确使用,不容易被误用
“最好的情况,就是如果客户企图使用某个接口而却没有获得预期的行为,这个代码就不应该通过编译;如果代码通过了编译,它的作为就该是客户想要的。” 所以在接口设计时,应该从用户的角度出发,考虑用户会犯什么错误: class Date { public: Date(int m, int d, int y):day(d),month(m),year(y){} private原创 2017-05-17 19:57:33 · 713 阅读 · 0 评论