//############################################################################
/* 在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++进阶--编译器自动生成的类函数的更多相关文章

  1. C++进阶--不让编译器自动生成类函数

    //############################################################################ /* * 不让编译器自动生成类函数 * * ...

  2. Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...

  3. 【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝

    地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子 class HomeFoeSale { ......} 但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作 ...

  4. Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ...

  5. C++如何拒绝编译器自动生成的函数

    每一个class,编译器都会自动生成四个特殊成员函数: destructor(析构函数) default constructor(默认构造函数) copy constructor(copy构造函数) ...

  6. Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...

  7. Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝

    一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...

  8. Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ...

  9. Effective C++ 条款六 若不想使用编译器自动生成的函数,就该明确拒绝

    class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForS ...

随机推荐

  1. Unity反射探针用法教程

    Unity 3D反射探针 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  2. Estimating Linguistic Complexity for Science Texts--paper

    http://aclweb.org/anthology/W18-0505 https://sites.google.com/site/nadeemf0755/research/linguistic-c ...

  3. MySQL用户管理、常用sql语句、MySQL数据库备份恢复

    1.MySQL用户管理 给远程登陆用户授权:grant all on *.* to 'user1'@'127.0.0.1' identified by '123456' (这里的127.0.0.1是指 ...

  4. (7)MySQL的事务

    什么是事物: 作用:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像 ...

  5. 【湖南师范大学2018年大学生程序设计竞赛新生赛 L】【HDOJ2476】【区间DP】

    https://www.nowcoder.com/acm/contest/127/L L 小小粉刷匠 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开 ...

  6. java知识 特殊符号转换

    ■情况 想把代码中的出现  “  ’等特殊符号时,在他们的前面,转换时自动加 \    最后转换成json 决定用ObjectMapper这个类,先准备一个Map,之后,map作为一个参数,调用Obj ...

  7. 小白python 安装

    小白python 安装: https://blog.csdn.net/qq_36667170/article/details/79275605 https://blog.csdn.net/nmjuzi ...

  8. 下面有关 JAVA 异常类的描述,说法正确的有()

    都是Throwable的子类: 1.Exception(异常) :是程序本身可以处理的异常. 2.Error(错误): 是程序无法处理的错误.这些错误表示故障发生于虚拟机自身.或者发生在虚拟机试图执行 ...

  9. 【NOI2005】 聪聪可可

    树分治劲啊 原题: 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了, ...

  10. Lucene&Solr(索引) 暂空

    1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a)         创建索引 b)         查询索引 3.配置开发环境 4.创建索引库 5.查询索引库 6 ...