C++进阶--不让编译器自动生成类函数
//############################################################################
/*
* 不让编译器自动生成类函数
*
*
*
* 并不是所有的类都需要编译器自动生成类函数
*
* 例: 一个"OpenFile" 类表示一个被打开的文件。构造函数至少需要一个文件名作为参数
* 所有不需要默认构造函数
*/
那么如何让编译不自动生成函数
/*
* 对于C++ 11:
*/
class dog {
public:
dog(const dog& ) = delete; // 直接使用delete关键字即可
// 当资源不可共享时将拷贝构造禁用
}
/* 对于C++ 03:
*
1. Default constructor. - 简单
2. Copy constructor. - 见以下解决方法
3. Copy Assignment Operator. - 见以下解决方法
方法1:
将其声明为private函数,但是不定义它们
-- 对于成员和友元,会链接时错误,因为没有实现
-- 对于其他,会编译时错误
*/
class dog {
private:
dog& operator=(const dog& rhs);
};
/*
方法2:
在基类中,将其声明为private函数,但是不定义它们
-- 编译时错误
*/
class yellowdog : public dog {
};
int main() {
yellowdog y1("henry");
yellowdog y2;
y2 = y1;
}
// 注意:以上方法可以用于禁用任何函数
/* 问题:析构函数是否可以被禁用?使用场景?
*/
/* 方法 */
class dog {
public:
void destroyMe() { delete this; }
private:
~dog() { cout<< m_name.m_str << " is destroyed.\n" << endl; }
};
int main ()
{
dog* dog1 = new dog();
dog1->destroyMe();
}
/* 使用场景: 1. 引用计数的智能指针
* 2. 栈空间很小的嵌入式编程 //只能在堆上保存,因为如果是在栈上生成,堆栈rewind的时候肯定会调析构函数
*/
C++进阶--不让编译器自动生成类函数的更多相关文章
- Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...
- C++进阶--编译器自动生成的类函数
//############################################################################ /* 在C++ 03标准下 在没有显式定义 ...
- 【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 ...
随机推荐
- JAVA基础部分复习(一、8中基础类型,以及String相关内容)
以下是关于java中8种基本类型的介绍说明: package cn.review.day01; /** * java基础复习,8种数据类型 * (byte,short,long,int,double, ...
- unity中实现简单对象池,附教程原理
Unity对象池的创建与使用 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
- Gym101482 NWERC 2014(队内训练第4场)
-----------------------前面的两场感觉质量不高,就没写题解----------------------------- A .Around the Track pro:给定内多边形 ...
- git 应用
git - 简易指南 助你开始使用 git 的简易指南,木有高深内容,;). 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹, ...
- 《DSP using MATLAB》Problem 6.18
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 《DSP using MATLAB》Problem 5.37
证明过程: 代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 《DSP using MATLAB》Problem5.33
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 【BZOJ3144】【HNOI2013】切糕
总算做了一道2011以后的省选题了……原题: 图片题面好评! P,Q,R≤40,0≤D≤R,给出的所有的不和谐值不超过1000. 文本样例好评! 恩这个是听妹主席讲过后会写的,首先把每个点拆成链,那么 ...
- struts2 中的数据访问servletAPI
ActionContext包含其他数据对象,包括值栈 每次请求都会创建一个ActionContext对象 通过ActionContext访问数据 在action中读取 在jsp页面中读取 1 ...
- Linux内核模块编程之Helloworld(初级)
注意printk那里,KERN_ALERT和打印消息之间是没有逗号的,搞得劳资查了半天才发现一直没有提示信息的原因 #include <linux/init.h> #include < ...