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

地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子


class HomeFoeSale { ......}

但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作不应该正确!


HomeForSale h;
HomeForSale h1(h); //调用复制构造函数
HomeForSale h2 = h; //调用赋值操作符

阻止这两个操作(复制、赋值)可以不声明它们,but自己不声明,编译器会自动生成,并且访问权限还是public。没办法只好声明出来,但是如何组织这两个操作呢,好吧,把他们的访问权限声明为private,因为阻止这两个操作,因此只声明,不定义。例如:


#include <iostream>
#include <vector>
using namespace std;

class base
{
public:
base() {};
private:
base(const base&);
base& operator=(const base&);
};

int main()
{
base b;
base b1(b);
}

结果

?





1

2

3

del5.cc: 在函数‘int main()’中:

del5.cc:10:3:
错误: ‘base::base(const base&)’是私有的

del5.cc:18:11:
错误: 在此上下文中

但是问题又来了:如果类中的成员函数或类的友元函数访问咋整,例如:


#include <iostream>
#include <vector>
using namespace std;

class base
{
public:
base() {};
void hello() { base b; base m(b); base n = b; }
private:
base(const base&);
base& operator=(const base&);
};

int main()
{
base b;
}

可以利用继承来解决例如


#include <iostream>
#include <vector>
using namespace std;

class base
{
protected:
base() {};
~base() {};
private:
base(const base&);
base& operator=(const base&);
};

class HomeForSale : public base
{
public:
HomeForSale() : base() {}
};

int main()
{
HomeForSale d;
}

这样,HoemForSale的朋友或成员函数也无力回天了(毕竟父类的函数是private的).

反思

c++ 中的流对象就是采用这样的原理.


#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
ifstream i;
ifstream i2(i);
}

错误提示

?





1

/usr/include/c++/4.6/bits/ios_base.h:788:5:
错误: ‘std::ios_base::ios_base(const std::ios_base&)’是私有的

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

时间: 2024-12-16 16:08:02

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

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

1. 某些类的含义决定了它们不具备某些功能,也就是说某些函数不能被创造出来以防被错误的使用(例如定义一个Book类,它含有一个表示ISBN的变量,这种情况下拷贝构造函数以及赋值操作符显然是没有意义的,因为任何两种书的ISBN都不同),但是编译器在类的创建者没有声明默认构造函数,拷贝构造函数,赋值操作符和析构函数的情况下会产生这些函数,为了避免这种情况,可以将这些函数声明为private并且不提供它们的定义来阻止它们的使用,但是如果这些函数经由其他成员函数或者友元函数调用,错误将会在链接期才能被发

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

class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForSale&); HomeForSale& operator = (const HomeForSale&);//只有申明,此函数很少被使用   };   //方法二,设计一个专门用来阻止copying动作的基类,然后让其他类继承这个类即可   class Uncopyable { prot

条款6:不想使用编译器自动生成的函数,就要明确拒绝!

每一个对象都是独一无二的,如果不想其被复制,我们就希望其复制以失败收场.如一座房屋出售HomeForSale类: 1 HomeForSale h1; 2 HomeForSale h2; 3 HomeForSale h3(h1);//我们希望这俩语句以失败告终 4 h1=h2;// 通常情况下,我们使用某个功能时,调用相对应的函数即可,如果这个函数没有被定义,则编译器会提示错误.但是这一情况不适用复制构造函数和赋值构造函数.因为条款5已经指出,如果你不声明它们,而有人希望调用它们,编译器就会替你声

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

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现.使用像Uncopyable这样的base class也是一种方法 classUncopyable{ protected: //允许derived对象构造和析构 Uncopyable(){} ~Uncopyable(){} private: Uncopyable(constUncopyable&); //但阻止c

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

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就是了.但这个策略对copy构造函数和copy assignment操作符却不起作用,你如果不声明它们,而某些人尝试调用它,编译器会为你声明它们. 这把你逼到了一个困境.如果你不声明copy构造函数和copy assignment操作符,编译器可能为你产出一份,于是你的clas支持copying.如果

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

如果自己定义的类中并不需要copy assignment操作符或者copy构造函数,为了避免编译器自动生成 因为编译器自动生成的没什么用,一般是按照顺序进行赋值或者拷贝,对于有对象内含有指针的话可能会出现一些问题 可以在private中声明(并不定义)它们.但是,友元和成员函数依然可以调用它们. 在C++11标准中可以用如下方法: class A { public: A(const A&) = delete;//不实现的函数可以不用写参数,光是声明其实也可以不用写参数 A operator=(c

若不想使用编译器自动生成的函数,就该明确拒绝

//有些情况下,想要明确地拒绝对象之间的拷贝,可以采用两种方式: //方式1: 将拷贝构造函数和赋值操作声明为private,且不去实现 class A { private: A(const A&); A& operator=(const A&); }; int main() { A a1; //报错:没有默认的构造函数, 一旦存在自定义的构造函数,即使是copy构造函数,编译器也不再会生成默认构造函数了. A a2 = a1; //报错:拷贝构造函数不可访问.return 0;

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

Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6. 若不想使用编译器自动生成的函数,就该明确拒绝 (Explicitly disallow the use of compiler-generated functions you do not want) 地产中介商卖的是房子,一个中介软件系统自然而然想必有个 class 用来描述待售房屋: cla

条款6:如果不想使用编译器自动生成的函数,就应该明确的拒绝。

有些情况自己是不希望生成拷贝构造函数以及拷贝赋值运算符的,这种时候不能只是自己不去编写这些函数,因为这样编译器会自动的去生成这些函数.保险一点的做法是将拷贝构造函数以及拷贝赋值运算符都声明为private的.这样既阻止了编译器生成默认的版本,而且又阻止了别人去调用它. 注意上面的这条“将成员函数声明为private而故意的不去实现它”是一种常用手段,即使是标准程序库中有的部分也是这样做的. class HomeForSale//很明显,销售的两个方子一般内容都是不相同的,所以拷贝构造函数以及 {