条款05:了解C++默默编写并调用哪些函数
每一个class都会有一个或多个构造函数、一个析构函数、一个copy assignment操作符。这些控制着基础操作,像是产出新对象并确保它被初始化、摆脱旧对象并确保它被适当清理、以及赋予对象新值。
那么当你当你编写了一个empty class的时候,当你利用编译器的对代码进行处理的时候,它其实已经并非是一个empty class 了。编译器会悄悄的给你生成了default 构造函数、一个析构函数、一个copy构造函数和一个copy assignment操作符,并且它们都是inline的(隐式inline)。如下代码示例
一个自定类: class empty{};
其实等于以下代码:
class Empty {
public:
Empty() { }//default 构造函数
~Empty() { }//析构函数
Empty(const Empty& rhs) { }//copy构造函数
Empty& operator=(const Empty& rhs) { }//copy assignment操作符
};
注意:上面的重载的操作运算符operator=的返回值是对象的引用,条款21似乎说了不要妄想返回对象的引用,这篇文章的意思不是说不能返回对象的引用,而是当你要返回对象的引用的时候,要确定引用的本体是谁,它能否被合理的delete。
以下三种情况出现时,会调用一个类的拷贝构造函数:
1) 用一个已经实例化了的该类对象,去实例化该类的另外一个对象;
2) 用该类的对象传值的方式作为一个函数的参数;
3) 一个函数返回值为该类的一个对象。
#include <iostream> using namespace std; class Person
{
public: Person(string& a, const int& b) : name(a), id(b) { } private: const int id;
string& name; }; int main()
{
Person p1(string("chu"), 1); Person p2(string("jun"), 2); p1 = p2;/////// error C2582: 'operator =' function is unavailable in 'Person' system("pause"); return 0;
}
还有一种情况编译器不会生成copy assignment函数,就是基类将copy assignment声明为private,派生类型就无法获得编译器的帮助,因为编译器为derived classes所生成的copy assignment操作符要处理base class成分。因为派生类型无法调用基类型的copy assignment函数(不具备访问权限)。
#include <iostream> using namespace std; class BaseClass
{ private: BaseClass& operator=(const BaseClass& rhs) { } }; class derived : public BaseClass { }; int main()
{ BaseClass px1, px2; px1 = px2; ///// 'BaseClass::operator =' : cannot access private member declared in class 'BaseClass' system("pause");
return 0; }
所以,请记住:
编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,以及析构函数。
条款05:了解C++默默编写并调用哪些函数的更多相关文章
- Effective C++ -----条款05:了解C++默默编写并调用哪些函数
面对“内含reference成员或者含const成员”的class内支持赋值操作,你必须自己定义copy assignment操作符. 如果某个base classes将copy assignment ...
- Effective C++ 条款05:了解C++编写并调用哪些函数
规则一 编译器默认操作 // 你认为 class Empty { }; // 实际上 class Empty { public: Empty() { ... } // default 构造函数 Emp ...
- Effective C++ 条款五 了解C++默默编写并调用哪些函数
//申明一个类时,编译器会默认为你提供四个函数. //无参构造函数,析构函数,copy构造函数,copy assignment操作符. template <typename T> ...
- EC笔记,第二部分:5.了解C++默默编写并调用哪些函数
5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...
- Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5 ...
- Effective C++条款05:了解C++默默编写并调用哪些函数
class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operato ...
- effective c++(05)(06)之c++默默编写并调用的函数
1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数.如下: 如果写下: class Empty{ }; 编译器就会实现以下代码: c ...
- 【05】了解C++默默编写并调用那些函数
1.如果没有声明copy构造方法,copy赋值操作符,和析构方法,编译器会自动生成这些方法,且是inline. 2.如果没有声明任何构造方法,编译器会自动生成一个default构造方法,且是inlin ...
- 条款5.了解c++默默编写并且调用了哪些函数。
如果想在一个内含reference成员的class内支持赋值操作,必须自己定义copy assignment操作符.而且面对“内含有const成员的”class,编译器的反应也是相同的,由于更改con ...
随机推荐
- 依赖注入(DI)和控制反转(IOC)
依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...
- Java常用类库--观察者设计模式( Observable类Observer接口)
如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口. import java.util.* ; class House extends Obse ...
- hdoj 2620 Bone Collector(0-1背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 思路分析:该问题为经典的0-1背包问题:假设状态dp[i][v]表示前i件物品恰放入一个容量为v ...
- localstroge可以在页面间传递数值;
连接地址为:http://4.suancai.sinaapp.com/localstorg/a.html 原理是,a页面设置了sessionstorge,b页面可以访问到; 并且已关闭浏览器,sest ...
- JSONP跨域的原理解析及其实现介绍
JSONP跨域的原理解析及其实现介绍 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-22 JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并 ...
- sql语句开发使用---update
单表的更新大家都用过了,现在说下实际开发过程中,需要多表的查询更新状态,或者跨数据库的更新状态. 东西需要学习了才会懂得,所以站在巨人的肩膀看的更远. sql 语法; UPDATE 表名称 SET 列 ...
- css6种隐藏元素的方法
6种方式可以隐藏一个元素: 1 CSS display的值是none.(该元素是不会在页面上显示) 2 type="hidden"的表单元素.(该元素是不会在页面上显示) ...
- Linux字符界面和图形界面
Ubuntu图形界面和字符界面的切换 Ubuntu和其他的Linux系统一样,有图形界面和字符界面,同时能够设置默认的启动界面. linux的显示界面分为命令行的字符界面和图形界面,我们可以设置lin ...
- Oracle 11g透明网关连接Sqlserver 2000
一.环境 公司网站系统使用的是IIS + Oracle 但公司某系统使用的是Sqlserver 2000, 但其数据需要做成报表放到网站上,为简化编程,使用Oracle做透明网关,定期从Sqlserv ...
- (图文教程)帝国cms7.0列表页模板调用多说评论次数
多说是站长朋友们常用的一款社会化评论插件.这里为大家介绍一下帝国列表页调用多说评论次数的方法. 文章由谢寒执笔.博客地址:www.cnblogs.com/officexie/: 1.首先在内容页模板中 ...