标签:
class Empty {};就好像写下这样的代码:
class Empty { public: Empty() { ... } // default构造函数 Empty(const Empty &rhs) { ... } // copy构造函数 ~Empty() { ... } // 析构函数 Empty& operator=(const Empty &rhs) { ... } // copy assignment操作符 };唯有这些函数被调用,它们才会被编译器创建出来.程序中需要它们是很平常的事.下面代码造成上述每一个函数被编译器产出:
Empty e1; // default构造函数 Empty e2(e1); // copy构造函数 e2 = e1; // copy assignment操作符编译器编写这些函数,这些函数做了什么呢?default 构造函数和析构函数主要是给编译器一个地方用来放置"藏身幕后"的代码,像是调用base classes 和non-static 成员变量的构造函数和析构函数.编译器产生的析构函数是个non-virtual,除非这个 class 的base class 自身声明有 virtual 析构函数.
templat <typename T> class NamedObject { public: NamedObject(const char *name, const T &value); NamedObject(const std::string &name, const T &value); private: std::string nameValue; T objectValue; };由于其中声明一个构造函数,编译器于是不再为它创建 default 构造函数.这意味着如果设计一个 class,其构造函数要求实参,就无须担心编译器会毫无挂虑的添加一个无实参构造函数而遮掉自己的版本.
NamedObject<int> no1("Smallest Prime Number", 2); NamedObject no2(no1); // 调用copy构造函数编译器生成的copy构造函数必须以no1.nameValue和no1.objectValue为初值设定no2.nameValue和no2.objectValue.两者中,nameValue的类型是string,而标准string有个copy构造函数,所以no2.nameValue的初始化方式是调用string的copy构造函数并以no1.nameValue为实参.另一个成员NamedObject<int>::objectValue的类型是int,那是个内置类型,所以no2.objectValue会以"拷贝no1.objectValue内的每一个bits"来完成初始化.
template <class T> class NamedObject { public: NamedObject(std::string& name, const T& value); private: std::string& nameValue; const T objectValue; };现在考虑下面会发生什么事:
std::string newDog("Persephone"); std::string oldDog("Satch"); NamedObject<int> p(newDog, 2); NamedObject<int> s(odlDog, 36); p = s;赋值之前,不论p.nameValue和s.nameValue都指向string对象.赋值动作该如何影响p.nameValue呢?赋值之后p.nameValue应该指向s.nameValue所指的那个string吗?
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/48022499