C++进阶--编译器自动生成的类函数
//############################################################################
/*    在C++ 03标准下
在没有显式定义的情况加,编译器会自动生成以下4个函数
1. 拷贝构造函数
2. 拷贝赋值运算符
3. 析构函数
4. 默认构造函数(只有当没有声明任何构造函数的时候)
*/
class dog {};
/* 这个看似空的类,其实等效于下面这个类 */
class dog {
	public:
		dog(const dog& rhs) {...};   // 逐成员的初始化
		dog& operator=(const dog& rhs) {...}; // 逐成员的拷贝
		dog() {...};  // 1. 调用基类的默认构造函数,按照他们的继承时声明的顺序
		              // 2. 调用数据成员的默认构造函数,按照他们在类中声明的顺序
		~dog() {...}; // 1. 调用基类的析构函数
		              // 2. 调用数据成员的析构函数
/*
注意:
1. 这些函数是公有且内联的public and inline.
2. 只有当需要的时候才会生成,即如果没用到不会生成
3. 如果某个函数不满足生成的必要条件,则不会生成该函数
*/
/*  例子:  编译器是否会自动生成这些函数
  1. Copy constructor.   - no 因为没有用到拷贝构造
  2. Copy Assignment Operator. - yes
  3. Destructor.  - no 用户自己已定义
  4. Default constructor - no 已经有用户定义的构造函数
*/
class dog {
	public:
		string& m_name;   // 如果这里改成引用,则此程序没法编译通过,因为该引用成员不允许拷贝
		dog(string name = "Bob") {m_name = name; cout << name << " is born." << endl;}
		~dog() { cout<< m_name << " is destroyed.\n" << endl; }
};
int main() {
  dog dog1("Henry");
  dog dog2;
  dog2 = dog1;  //需要逐成员拷贝
}
输出:
Henry is born.
Bob is born.
Henry is distroied.
Henry is distroied.
注意:
 当拷贝赋值运算符是非法的时候,编译器会拒绝生成它
 1. 引用成员数据
 2. 常量成员数据
这样的类不能用在STL容器中,因为容器的元素必须
能够拷贝构造和拷贝赋值
*/
/* 例子 2: */
class collar {
	public:
	collar() { std::cout <<  " collar is born.\n"; }
};
class dog {
	collar m_collar;
	string& m_name;
};
int main() {
	dog dog1;
}
输出:
main.cc:13: error: no matching function for call to `dog::dog()'
main.cc:8: note: candidates are: dog::dog(const dog&)
// 没法编译通过,因为编译器会尝试为dog类生成默认构造函数,
// 需要先生成数据成员collar m_collar的默认构造函数,而collar类已经有一个构造函数
// 如果在dog类中增加如下成员:
// string& m_name;
// Result: not compilable because age is not initialized.
// 生成的默认构造函数不会进行初始化,引用必须初始化
/* C++ 11 Update: */
class dog {
   public:
      dog() = default;  //C++ 11提供了定义默认构造函数的方法
      dog(string name) {...};  //即使已经定义了其他构造函数,还可以定义默认构造函数
}
C++进阶--编译器自动生成的类函数的更多相关文章
- C++进阶--不让编译器自动生成类函数
		//############################################################################ /* * 不让编译器自动生成类函数 * * ... 
- Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝
		Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ... 
- 【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝
		地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子 class HomeFoeSale { ......} 但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作 ... 
- Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
		(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ... 
- C++如何拒绝编译器自动生成的函数
		每一个class,编译器都会自动生成四个特殊成员函数: destructor(析构函数) default constructor(默认构造函数) copy constructor(copy构造函数) ... 
- Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
		为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ... 
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
		一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ... 
- Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
		规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ... 
- Effective C++ 条款六  若不想使用编译器自动生成的函数,就该明确拒绝
		class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForS ... 
随机推荐
- lecture7图像检索-七月在线-cv
			http://blog.csdn.net/u014568921/article/details/52518587 图像相似性搜索的原理 BOW 原理及代码解析 Bag Of Visual Words ... 
- PTA——龟兔赛跑
			PTA 7-39 龟兔赛跑 #include <stdio.h> int main () { ,turtle=,minute,rest=-,run=; //rest为0或负时,兔子休息,r ... 
- random(随机模块)
			程序中有很多地方需要用到随机字符,比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串 >>> random.randrange(1,10) #返回1-10之间的一 ... 
- da shu mo ban
			#include<bits/stdc++.h> using namespace std; ;/*精度位数,自行调整*/ //1.如果需要控制输出位数的话,在str()里面把len调成需要的 ... 
- hdu4553 约会安排 线段树
			寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实 ... 
- set集合的遍历(基于迭代器和增强for循环,没有一般的for循环)
			赋:开发项目中见到的代码 Java中Set集合是一个不包含重复元素的Collection,首先我们先看看遍历方法 package com.sort; import java.util.HashSet; ... 
- ClusterControl 强大免费数据管理工具
			几张参考图 galera 集群管理 多种数据库管理 组件架构 参考资料 https://severalnines.com/docs/intro.html 
- buckaroo 试用
			我系统是mac 所以选择的是mac 的版本,官方是支持跨平台的. 安装 mac 版本安装 wget https://github.com/LoopPerfect/buckaroo/releases/d ... 
- ethr 微软开源的tcp udp http 网络性能测试工具
			ethr 是微软开源的tcp udp http 网络性能测试工具包包含的server 以及 client 我们可以远程测试 同时对于https icmp 的支持也在开发中,tcp 协议支持连接.带宽. ... 
- 微信编辑器 wxEditor 最牛逼的富文本编辑器
			时尚最牛逼的富文本编辑器 http://wxeditor.leipi.org/ http://www.wwei.cn/ 
