NO.5: 了解C++编译器默认为你生成的构造/赋值/析构

1.编译器可以暗自位class生成default构造,copy构造,copy assigned函数,析构函数;

note1:如果没有自定义构造函数,编译器会为你生成合成默认构造函数.如果有定义则不生成

note2:如果没有定义copy构造和copy assigned函数,编译器也会为你生成合成默认的,注意点:如果成员变量有引用或者const成员,需要自定义copy assigned函数(C++不允许"reference value 改变指向对象,所以编译器拒绝执行合成默认copy assigned函数生成")

note3:如果 base class 中copy assgined函数或构造函数 is private,编译器无法为 derived calss 合成这部分copy assigined/construct,因为无权限

note3:编译器生成的析构函数不具有virtualness属性,除非base class声明virtual destruct,编译器为derived class 生成的destruct函数才具有 virtual 属性;

note4:编译器为你合成的这些default构造,copy构造,copy assigned函数,析构函数,你不调用是不会为你生成的;

 1 #include <iostream>
 2
 3
 4 class include_
 5 {
 6 private:
 7     int &b;
 8 public:
 9     include_(int &c) : b(c)
10     {}
11
12 };
13
14
15 int main(int argc, char **argv)
16 {
17     int a = 200, b(300);
18     include_ A(a);
19     include_ B(b);
20     //error:copy assignment operator is implicitly deleted
21     A=B;
22     return 0;
23 }
时间: 2024-10-19 18:31:58

NO.5: 了解C++编译器默认为你生成的构造/赋值/析构的相关文章

EC笔记,第二部分:6.若不想使用编译器默认生成的函数,就该明确拒绝

6.若不想使用编译器默认生成的函数,就该明确拒绝 1.有的时候不希望对象被复制和赋值,那么就把复制构造函数与赋值运算符放在private:中,但是这两个函数是否需要实现呢?假设实现了,那么你的类成员方法和friend函数(类)仍然可以使用这些方法,最好的方法是在private:中声明儿不定义他们,这样当成员方法或friend:函数(类)企图调用这些方法的时候,会报出链接错误,因为方法没有被实现.(iostream中就是这样防止拷贝的) 2.多重继承中可用protected:控制 总结:

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成物理查询计划

SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理运行计划. 前两个步骤请參见我的博客<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树>>和<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成逻辑计划>>.这篇博客主要研究第三步,生成物理查询计划. 一. 什么是物理查询计划 与之前的阅读方法一致,这篇博客的两个主要问题是what 和how.那么什么是物理查询计划?物理查询计划可以直接运行并返回数据

解析PHP默认的session_id生成算法

作为一个web程序猿,我们对session肯定都不陌生,session id是我们各自在服务器上的一个唯一标志,这个id串既可以由php自动来生成,也可以由我们来赋予.你们可能和我一样,很关心php自动生成的那个id串是怎么来的,冲突的概率有多大,以及容不容易被别人计算出来,所以有了下文. 我们下载一份php5.3.6的源码,进入/ext/session目录,生成session id的函数位于session.c文件的345行,下面详细介绍一下这个函数.为了方面理解,我调整了一些代码的顺序. PH

淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成逻辑计划

淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成逻辑计划 SQL编译解析三部曲分为:构建语法树.生成逻辑计划.指定物理运行计划. 第一步骤,在我的上一篇博客淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树里做了介绍,这篇博客主要研究第二步.生成逻辑计划. 一. 什么是逻辑计划? 我们已经知道,语法树就是一个树状的结构组织,每一个节点代表一种类型的语法含义.如 update student set sex="M" where name =&

Qt不同版本编译器,调用VC++生成的动态链接库

今天用QT编译生成的共享库自己却怎么都不能调用,查了N久后找到这个帖子,发现搞定了,记录一下 http://qiusuoge.com/12720.html Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll. testdll.h文件源码如下: #ifdef TESTDLL_EXPORTS #define TESTDLL_API __declspec(dllexport) #else #define TE

C++中的默认函数 深拷贝与浅拷贝 深赋值与浅赋值

1.C++中什么都不写,就有6个默认函数,由系统自动提供: 构造函数,拷贝构造函数,赋值语句,析构函数,对一般对象的取地址符,对常对象的取地址重载: 对&运算符的重载: Test t3; Test *pt = &t3; Test* operator&(){     return this; } 对常对象的取地址重载: const Test t4; const Test *pt1 = &t4; const Test* operator&()const{     ret

Git 安装不是默认路径,生成密钥

首先在 Git 官网(https://git-scm.com/downloads)下载安装包,官网下载太慢的话,可通过链接下载(https://pan.baidu.com/s/1u9pcNyhaJHIDysSHYbt9Ew),提取码为(8jhe) 1. 安装的步骤一直 Next Step 即可 2. 生成密钥 (1)安装成功之后,找到 Git 文件,点击 Git Bush (2)要求输入用户名和密码,第一个打码是用户名,第二个打码是邮箱 (3)进入到 .ssh 文件夹中,看是否已经存在密钥,或者

面向对象2

笔记:1:方法的签名: 方法名+参数列表 2.方法的重载(overload): 1)在同一个类中,方法名相同,参数列表不同 2)编译器在编译时根据签名自动绑定调用不同的方法 3.构造方法(构造器,构建器,构造函数): 1)作用:给成员变量赋初值 2)与类同名,没有返回值类型 3)在创建(new)对象时被自动调用的 4)若自己不写构造方法,则编译器默认提供一个无参构造, 若自己写了,则不再默认提供 5)构造方法可以重载 4.this:指代当前对象,谁调指的就是谁 方法中访问成员变量之前默认有个th