zoukankan      html  css  js  c++  java
  • Effective C++ 条款12: 尽量使用初始化而不要在构造函数里赋值

    本条款实际上在解决一个疑问,为什么要有成员初始化列表这个东西,直接在构造函数里赋值不行吗?

    条款给出了2点理由:

    1.有些情况下必须用初始化——特别是const和引用数据成员只能用初始化,不能被赋值。

    2.成员初始化列表的效率比赋值的效率高。

    看第一种情况:

    class A
    {
    	const int constVal;
    public:
    //	A() { constVal = 0;}   //error
    	A() : constVal(0) {}   //right
    };


     

    看第二种情况,先看在构造函数里赋值的情况,这时要调用A的构造函数和赋值构造函数

    class A
    {
    public:
    	A() {cout << "A()" << endl;}
    	A& operator=(A &a) {cout << "A& operator=(A &a)" << endl; return *this;}
    };
    
    class B
    {
    	A a;
    public:
    	B(A &aa)
    	{
    		a = aa;   //先调用A()构造a对象,然后调用A& operator=(A &a)赋值。
    		cout << "B(A &aa)" << endl;
    	}
    
    	B& operator=(B &b)
    	{
    		cout << "B operator=" << endl;
    		return *this;
    	}
    
    };
    
    int main(void)
    {
    	A a;
    	B b(a);
    
    	return 0;
    }
     
    输出:
    A()
    A()
    A& operator=(A &a)
    B(A &aa)
     
     
    再看成员初始化列表初始化,这时只需调用A的copy构造函数:
    class A
    {
    public:
    	A() {cout << "A()" << endl;}
    	A(A& a) {cout << "A(A& a)" << endl;}
    	A& operator=(A &a) {cout << "A& operator=(A &a)" << endl; return *this;}
    };
    
    class B
    {
    	A a;
    public:
    	B(A &aa): a(aa)
    	{
    		cout << "B(A &aa): A(aa)" << endl;
    	}
    
    	B& operator=(B &b)
    	{
    		cout << "B operator=" << endl;
    		return *this;
    	}
    
    };
    
    int main(void)
    {
    	A a;
    	B b(a);
    
    	return 0;
    }
     
    输出:
    A()
    A(A& a)
    B(A &aa): A(aa)
  • 相关阅读:
    android开发中的数据库SQLite的使用
    线程间的同步和通信机制
    关于垃圾回收
    进程间通信
    Thread和Runnable
    关于软件项目管理的感想~~~~~
    关于集成测试&&同行评审
    Junit and Maven Test
    window git
    use case
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3121413.html
Copyright © 2011-2022 走看看