zoukankan      html  css  js  c++  java
  • 17、C++ Primer 4th 笔记,构造函数

    1、构造函数初始化式只在构造函数的定义中而不是声明中指定。

    2从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2

    普通的计算阶段。计算阶段由构造函数函数体中的所有语句组成。不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段开始之前。

    3、使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数函数体中对数据成员赋值。

    4、没有默认构造函数的类类型的成员,以及 const 或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。

    5、内置类型的成员不进行隐式初始化,对非类类型的数据成员进行赋值或使用初始化式在结果和性能上都是等价的。

    6、成员被初始化的次序就是定义成员的次序。

    7、按照与成员声明一致的次序编写构造函数初始化列表是个好主意。此外,尽可能避免使用成员来初始化其他成员。

    8、初始化式可以是任意表达式。

    9、我们更喜欢使用默认实参,因为它减少代码重复。

    示例

    #include "iostream"
    
    using namespace std;
    
    class Sales_item {
    public:
    	//default argument for book is the empty string
    	Sales_item(const std::string &book = ""):
    	  isbn(book), units_sold(0), revenue(0.0) { }
        Sales_item(std::istream &is);
    	  // as before
    private:
    	string isbn;
    	int units_sold;
    	int revenue;
    };
    
    int main()
    {
    	Sales_item empty;
    	Sales_item Primer_3rd_Ed("0-201-82470-1");
    	return 1;
    }
    

    10、只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数。通常,在默认构造函数中给成员提供的初始值应该指出该对象是“空”的。

    11、如何使用默认构造函数?

    示例

    Sales_item myobj();// oops! declares a function, not an object
    //the following are right.
    Sales_item myobj; //defines a class object ...
    Sales_item myobj = Sales_item() //ok,create an unnamed, empty Sales_itemand use to initialize myobj
    

    12、隐式类型转换

    示例

    class Salse_item
    {
    publi:
    	Salse_item(const std::string &book = ""):isbn(book)...{}
    	Salse_item(std::iostream &is);
    	//explicit Salse_item(std::iostream &is);
    
    	...
    	bool same_isbn(Salse_item &si)
    	{
    	...
    	}
    };
    
    int main()
    {
    	Salse_item item;
    	string null_book = "12345";
    	item.same_isbn(null_book); //会发生自动转换,把string类型转换成Salse_item型。
    	item.same_isbn(cin);  ////会发生自动转换,把cin流类型转换成Salse_item型。
    	//item.same_isbn(Salse_item(null_book)); //显式的进行转换
    }
    

    如上例中所示,我们构造了一个测试完成后被丢弃的对象,这个行为几乎是一个错误。

    1)抑制由转换构造函数定义的隐式转换

    声明为explicit,来停止隐式转换的上下文中使用构造函数。

    2)如果真的需要转换,则显式的进行。

        通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为 explicit

    参考

    [1] http://blog.163.com/zhoumhan_0351/blog/static/3995422720100250413207/

    [2] http://blog.163.com/zhoumhan_0351/blog/static/39954227201032845132592/

    [3] http://blog.163.com/zhoumhan_0351/blog/static/399542272010318112048522/

    [4] http://blog.163.com/zhoumhan_0351/blog/static/39954227201032092854732/

    [5] http://blog.163.com/zhoumhan_0351/blog/static/3995422720100284731826/

  • 相关阅读:
    93. Restore IP Addresses
    mysql复制那点事(2)-binlog组提交源码分析和实现
    49. Group Anagrams
    43. Multiply Strings
    66. Plus One
    100. Same Tree
    MySQL 加锁处理分析
    mysql死锁问题分析
    数据库事务的四大特性以及事务的隔离级别
    MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
  • 原文地址:https://www.cnblogs.com/mydomain/p/1993632.html
Copyright © 2011-2022 走看看