Effective C++读书笔记之若不想使用编译器自动生成的函数,就该明确拒绝

《Effective C++》 读书笔记(详细总结55条款)上篇 下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性 阅读详情

 通常你不希望class支持某一特定机能,只要不声明对应函数就可以达到目的。可是这个策略对copy构造函数和copy assignment操作符却不起作用,因为如果你不为某个class声明这两个函数,即你不想这个class的对象有这两个功能(如下面的代码所示),
 class HomeForSale {...};             //一个类你不希望它的一个对象可以copy构造另一个对象或赋值给另一个对象
 HomeForSale h1;                        //在这个类中没有声明copy构造函数和copy assignment操作符函数
 HomeForSale h2;                   
 HomeForSale h3(h1);                //企图拷贝h1---不该通过编译
 h1 = h2;                                         //企图拷贝h2---也不该通过编译
可是当你的程序使用这个类的copy构造函数或copy assignment操作符,编译器会自动生成相应的代码(见上次笔记)。这个不是我们希望看到的。有两个办法可以达到通知编译器的不自动生成这些代码的作用:
 1,你自己声明copy构造函数和copy assignment操作符函数,而不用给出它们的定义式,同时把它们声明为private。
 这样有两个目的:1) 你的编译器不会自动给你生成相应的函数,因为你已经声明了。 2) 因为它们是私有的,所以类的对象不能调用它们。这样达到了我们的目的。如果类的member函数和friend函数调用了上面的函数,编译器会给出一个连接错误(linkage error),这个方法被C++ iostream程序库使用。即标准程序库中ios_base,basic_ios等类中的copy构造函数和copy assignment操作符函数被声明为private。
 例子如下:
 class HomeForSale{
  public:
      ....
  private:
      ....
      HomeForSale(const HomeForSale&);                 //只有声明 并且为private
      HomeForSale& operator=(const HomeForSale&);      //只有声明 并且为private
 };
 2,设计一个禁止copy操作的基类,把上面的声明移到这个基类中。其它的类继承这个类就可以了
 好处:可以把上面提到的连接错误转移到编译期(这个是好事,毕竟愈早侦测出错误愈好)
 基类代码: 
 class Uncopyable {
  protected:
      Uncopyable() {}
      ~Uncopyable() {}                //允许derived对象构造和析构
  private:
      Uncopyable(const Uncopyable&);  //只声明不实现
      Uncopyable& operator=(const Uncopyable&);    
 };
 这防止HomeForSale对象被拷贝,唯一要做的就是继承这个类
 class HomeForSale : private Uncopyable { .... }; //这个类中不用再声明copy构造函数和copy assignment操作符函数
 总结:
 为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现,也可以使用像Uncopyable这样的base class。

Android 13.0 framework层系统手势增加上滑手势home事件功能(相当于Home键) 在13.0的定制化开发系统手势功能的时候,客户需求要求在上滑手势的时候,在底部上滑时候进入系统桌面,也就是增加 home键功能,所以就需要分析相关的系统手势上滑事件,然后添加home事件这样 就可以实现这个功能了 阅读详情

相关推荐

【WebLogic】Linux图形化界面安装WebLogic 14.1.2.0

Linux系统图形化界面安装WebLogic 14.1.2.0.0版本

cnskylee的博客 837

Effective C++ 读书笔记 Item6 若不想使用编译器自动生成的函数,就该明确拒绝

试想如下情形,某个房地产商所拥有的房子都是不同的,同时你在为这个公司设计程序,而你不想将一座房子的信息拷贝给另一座房子,这就需要禁止使用拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)。 class House{...}; House h1; House h2; House h3(h2); //禁止执行 h1=...

Vermont_的博客 193

计算机组成原理实验logisim(四)之运算器实验

注意,上半张图中所有连入32位宽多路选择器的器件和的“数据位宽”都是32,而中间部分连入1位多路选择器的器件的“数据位宽”皆为1(除了连向“32位加法器”的那一个非门,是32位)。第二到第五个实验的测试,具体怎么测试好吧我也不太清楚,听室友说就是让你分析各种亮灯的原理,比如你点这个,那个为什么颜色要变等等,我就不粘图了,恩大家加油。连图如下,需要在连线之前格外注意“异或门”和“与门”的位宽,将16改为1,不然数据无法通行。关于学术问题,为何这样连什么的,就别问我了,我也没有搞的那么透彻。

qq_54422132的博客 2万+

读书笔记《Effective C++》条款06:若不想使用编译器自动生成的函数,就该明确拒绝

所有编译器产出的函数都是public。如果不想让编译器自动生成这些函数,得自行声明它们,可以将copy构造函数或copy assignment操作符声明为private,这样就阻止了编译器暗自创建的版本,而且令这些函数为private,得以成功阻止人们调用它们。 一般而言这个做法并不绝对安全,因为member函数和friend函数还是可以调用private函数。有种办法:只声明这些private

Do-Program的专栏 483

华为防火墙介绍和原理,配置详细解析

在出向外网的流量中,我们使用默认路由来指定默认的出口,并且使用nat地址转换,而在外网中,我们使用ISIS协议来进行路由的学习和更新,让外网可以访问到dmz非军事化区域的server1服务器。并进行NAT转换,实现了内部IP地址和外部IP地址之间的映射,以便内部网络可以与外部网络进行通信。网络地址转换(NAT):防火墙可实现网络地址转换,将内部私有IP地址转换成公共IP地址,以隐藏网络拓扑结构,增加网络安全性。确定安全需求:根据企业的安全需求和策略,确定防火墙的配置目标和规则。

外游者 5098

qwen2vl ValueError: Image features and image tokens do not match: tokens: 568, features 600

本文介绍了一个用于计算多模态数据集中样本token数量的Python工具,特别针对包含文本和图像的Qwen2-VL模型数据集。

q742971636的博客 1012

【读书笔记】Effective C++ 条款5~6:若不想使用编译器自动生成的函数,就该明确拒绝

public:private:// 只声明不定义,阻止编译器自动生成double _s;说明每套房子都是唯一的,因此不允许拷贝将拷贝构造函数和拷贝赋值运算符声明为private,阻止了外部调用只声明不定义:如果成员函数或友元试图调用,会得到链接错误public:nocopy() {} // 允许构造和析构private:// 只声明不定义。

m0_68617924的博客 261

YOLOv8中的可变形卷积改进 | 从DCNv1到DCNv3的多位置替换可变形卷积保姆级实操

可变形卷积(Deformable Convolution)最早由Dai等人在2017年提出,其核心思想是在标准卷积操作的基础上,引入可学习的偏移量(offsets),使卷积核能够自适应调整其采样位置,从而增强模型对目标变形的感知能力。return x本文通过深入探讨可变形卷积在YOLOv8中的应用,详细介绍了DCNv1、DCNv2和DCNv3的原理和实现,并通过实验验证了其在目标检测任务中的有效性。未来,我们将继续探索更多优化策略和技术,提升YOLOv8模型的性能,以应对更复杂的目标检测任务。

一键难忘的博客 4049

Effective C++读书笔记之条款06:若不想使用编译器自动生成的函数,就该明确拒绝。

条款6:若不想使用编译器自动生成的函数,就该明确拒绝。 1、书中采用房子对象来举例,一套房子是一个独一无二的资源,不存在一模一样的两栋房子,因此是不支持拷贝操作。 class HomeForSale { …… }; HomeForSale h1; HomeForSale h2; HomeForSale h3(h1);//默认copy构造 出错 h1=h2;//默认copy assignment 出...

Struggling_Jeff的博客 237

基于深度确定性策略梯度的永磁同步电机强化学习控制方法

本文提出了一种基于深度确定性策略梯度(DDPG)的永磁同步电机(PMSM)电流内环智能控制方法。首先建立了PMSM在d-q坐标系下的数学模型,分析了传统矢量控制双闭环系统中PI控制器的局限性。针对电流内环控制问题,设计了包含电流跟踪误差、转速信息和历史控制量的状态空间,将电压输出作为动作空间,并构建了兼顾跟踪精度和响应速度的奖励函数。通过DDPG算法训练智能体,使其能够自适应调整控制策略。仿真结果表明,与固定参数的PI控制器相比,DDPG控制器在动态响应速度和抗干扰能力方面具有明显优势,为PMSM高性能控制

huanghm88的专栏 104

影楼精修-肤色统一算法解析

本文介绍了影楼精修中肤色统一算法的实现方案,并以像素蛋糕软件为例进行详细分析。肤色统一旨在通过调整人像照片中皮肤区域的颜色,使其看起来更加均匀一致。像素蛋糕软件提供了AI肤色统一和传统肤色统一两种功能,分别适用于不同需求。传统肤色统一算法通过皮肤分割、人脸检测、亮度统一和颜色统一等步骤,实现了对皮肤区域的精细调整。文章还提供了亮度统一的核心代码,并对比了传统算法与AI算法的效果,指出AI算法在自然度和亮度矫正方面表现更优。整体而言,本文为影楼精修中的肤色统一提供了实用的技术参考。

Trent1985的专栏 2068

读书笔记《Effective c++》 条款06 若不想使用编译器自动生成的函数,就应该明确拒绝

如果不希望编译器自动生成一些函数,例如树叶类不喜欢有赋值构造函数,因为“世界上没有完全相同的两片叶子”,有两个方法: a.本书中介绍的,将其声明为private而且不提供函数实现。   只声明成private还是不够,因为其他成员函数和friend函数还是能调用,所以好的做法还要不提供函数实现,当然,声明中最好也不写参数名。     当然,可以声明一个base cla

木头刀 226

万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用

ARINC 653 在综合模块化航空电子设备(IMA)的发展进程中扮演着极为关键的角色。从行业应用的实际情况来看,空客 A380 和波音 787 等先进飞机的航电系统套件充分体现了行业对 IMA 的高度重视和积极投入。在 IMA 架构下,核心软件具备强大的能力,能够支持多个航空电子应用程序的同时运行。这些应用程序可以并行开发,并高效地部署在同一个计算平台上,极大地提高了开发效率和系统集成度。ARINC 653 的出现为航空电子行业创造了一个充满活力和竞争力的商业环境。

2956

effective C++读书笔记--【条款06:若不想使用编译器自动生成的函数,就该明确拒绝】

蓝图 这条其实基本上就是针对copy构造函数和copy assignment操作符这两个函数的,为什么这么说呢,其他的函数,不想用的话,不要声明不要定义就完了,但是copy构造函数和copy assignment操作符不声明不定义的话编译器会自动整一套public的出来,所以这让人比较为难,作者给出了两个方案: 声明为private,但是不予以定义; 使用Uncopyable base cl...

liangll的博客 219

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Item 6:若不想使用编译器自动生成的函数,就该明确拒绝【effective C++读书笔记】

一般来说,如果不希望类实现某个功能,只要不定义相关的功能函数即可,但在Item 5 中我们知道:一旦尝试调用拷贝构造函数或拷贝赋值运算符,编译器就会自动生成默认。   如果想要阻止对象拷贝操作,我们可以自定义一个uncopyable类,将拷贝构造函数和拷贝操作符声明为私有,不给出实现,再继承它: class Uncoptable{ protected:              //允许派

花花世界 441

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Effective C++读书笔记之六:若不想使用编译器自动生成的函数,就该明确拒绝

Item 06:Explicitly disallow the use

极客时代 735

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

作者推荐的做法是制作一个Uncopyable类,然后不想要copy构造函数和copy assignment操作符的类继承这个Uncopyable类。 这样如果有函数里妄图使用该类的构造函数,在编译阶段就会直接报错。如果自己类里面把copy构造函数和copy assignment操作符声明为private,并且不定义它,也是可以的。但是相比上面提到个Uncopyable类技术,编译器报错的阶段是链接

qq_22594413的博客 193

《Effective C++读书笔记》--条款06:若不想使用编译器自动生成的函数,就应该明确拒绝

首先我们要明确,编译器产出的所有函数都是public,因此将成员函数声明为private且故意不去实现他们可以阻止编译器为你自动生成你不想要的函数。但我们在member函数或friend函数中使用该函数时,那么会在连接时发生错误,我们可以将错误迁移至编译阶段,此时的方法就是专门设计一个阻止拷贝动作的基类,这个基类的实现如下: class Uncopyable{ protected: Un

WingC的博客 363

读书笔记 effective c++ Item 6 如果你不想使用编译器自动生成的函数,你需要明确拒绝...

问题描述-阻止对象的拷贝   现实生活中的房产中介卖房子,一个服务于这个中介的软件系统很自然的会有一个表示要被销售的房屋的类: 1 class HomeForSale { ... };   每个房产中介会立刻指出来,要销售房屋的每个属性都是唯一的,没有两个完全一样的房屋。在这种情况下,拷贝一个HomeForSale对象就没有任何意义了。你在怎么能拷贝一些独一无二的东西呢?因此你可能会尝...

HarlanC的专栏 152

Effective C++读书笔记(条款05:了解C++默默编写并调用哪些函数 && 条款06:若不想使用编译器自动生成的函数,就该明确拒绝)

什么时候空类不再是一个空类呢?当C++处理过它之后。 如果自己没有声明,编译器就会为它声明一个拷贝构造函数、拷贝赋值操作符和一个析构函数。此外,如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是public且inline的。 编译器产出的析构函数是一个非虚函数,除非这个类的基类本身声明有virtual析构函数 如果你打算在一个“内含引用成员”的class内支持赋值操作,你必须自己定义拷贝赋值操作符。面对“内含const成员”的classes,编译器的反应

zhongh58的博客 399

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

序言 条款06:若不想使用编译器自动生成的函数,就应该明确拒绝 关于本条款,本人认为这样做的目的只有一点: 意图:阻止你没有明确定义的功能流向客户 手段:屏蔽C++偷偷为你的类提供的功能 比如“=”运算符是C++默默生成的,但是或许你根本不希望你的类可以这样赋值。比如默认构造函数,或许你根本不希望使用者那样构造你的对象。 实现手段 要屏蔽C++偷偷为你提供...

weixin_34256074的博客 76

读书笔记_Effective_C++_条款六:若不想使用编译器自动生成的函数,就该明确拒绝...

举个书上的例子,地产中介商卖的是房子,有这样一个类: class HomeForSale {…} 每个房子都是不一样的,所以希望这样: 1 HomeForSale house1; 2 HomeForSale house2; 3 HomeForSale house3(house1); // house3企图与house1相同,不能通过这种情况 4 house2 = hous...

weixin_30809333的博客 88

Effective C++ | 读书笔记 (一)

这意味着,如果你在一个编译单元中依赖于另一个编译单元中的全局静态对象的初始化结果,你的程序可能会遇到未定义行为,因为那些对象的初始化次序是不确定的。在构造、析构函数中一定只会调用本类中的虚函数。原因:当基类指针(引用)指向子类对象时,如果析构对象通过delete 指针的方式,只会调用基类的析构函数,不会调用子类的析构函数。如果把这个当做是基类,会有问题,析构函数只有声明没有定义,析构函数从派生类到基类的调用时,会发生链接错误。时,先调用基类的构造函数,此时派生类还没有被构造出来,所以调用的是基类的虚函数。

m0_74795952的博客 1042

《Effective C++》读书笔记

effective C++读书笔记,持续更新中......

weixin_45654421的博客 261

effective C++读书笔记2

这是effective C++第二章节内容:构造/析构/赋值运算。

! 512
上一篇: Effective C++读书笔记之了解C++默默编写并调用哪些函数
下一篇: Effective C++读书笔记之为多态基类声明virtual析构函数
anthit
博客等级 码龄21年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值