Effective C++读书笔记之绝不在构造和析构过程中调用virtual函数

Effective C++ 条款36:绝不重新定义继承而来的 non-virtual 函数 深入解析 Effective C++ 条款36,理解为什么不应该重新定义继承而来的 non-virtual 函数,掌握静态绑定与动态绑定的本质区别,避免面向对象设计中的常见陷阱。 阅读详情

 假设你有一个class继承体系,用来模拟股市交易的订单等。如下:
 class Transawction {             //所有交易的base class
  public:
   Transaction();  
   virtual void logTransaction() const = 0; //做出一份因类型不同而不同的日志记录
  ....
 };
 Transaction::Transaction()                //base class构造函数的实现
 {
  ...
  logTransaction();                 //最后动作是志记这笔交易,问题出在这
 }
 class BuyTransaction::public Transawction {     //derived class
  public:
   virtual void logTransaction() const;  //志记此型交易
 };
 class SellTransaction::public Transawction {     //derived class
  public:
   virtual void logTransaction() const;  //志记此型交易
 };
 现在有这样的代码:
 BuyTransaction b;
 先要调有基类的构造函数,但是这个函数调用了一个logTransaction函数。要注意这个logTransaction函数是基类中的版本,而不是派生类中的版本。同时在base class构造期间,对象的作为就像它本身就是base类型一样。
 C++编译器规定在derived class对象和base class构造期间,对象的类型是base class而不是derived class。不只是virtual函数会被编译器解析至base class,同时对象被视为base class类型。在本例中,当Transaction构造函数正执行起来初始化BuyTransaction对象中的base class成分时,该对象的类型是Transaction。对象在derived class构造函数开始中执行前不会成为一个derived class对象。
 同样的道理也适用于析构函数。
 总结:确定你的构造函数和析构函数都没有(在对象被创建和被销毁期间)调用virtual函数,而它们调用的所有函数也都不能调用的任何的virtual函数。

关于solidworks无法获得下列许可SOLIDWORKS Standard的解决方法 在使用solid works的时候,出现无法获得下列许可SOLIDWORKS Standard,刚开始还以为软件出了问题,经过一方折腾找到了解决方法。希望这个方法可以帮助到您 找到这个服务 问题到这里就已经得到了解决,但更大的问题是,要是每次遇见这种都要这么麻烦,岂不是很累?这里也提供一种方法。考虑到每个人的情况,下面说的可能有一点啰嗦。 !!!!!!注意那个在此期间之后重新启动服... 阅读详情

相关推荐

免费,Python蓝桥杯等级考试真题--第10级(含答案解析和代码)

Python中蓝桥杯算是含金量和难度最大的比赛之一,网上可以找到不少真题,不过要么零零散散要么付费才能解锁,而且大都是没答案和解析的,给学习者造成很大困扰。因此本文档打算整理历年等级考试、STEMA、省赛、国赛真题卷和解析,供大家学习参考。

1576

读书笔记《Effective C++》条款09:绝不在构造和析构过程中调用virtual函数

先看一个例子: class Transaction {//所有交易的abstract base class public: Transaction(); virtual void logTransaction() const = 0;//做出一份因类型不同而不同的日志记录(log entry) }; class BuyTransaction : public Transaction {//

Do-Program的专栏 324

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景,JDK与JDBC,Java Web技术,Spring Boot系列,以及MyBatis框架的基本实现,最后还将讨论Java在大数据、人工智能、嵌入式和Android等领域的应用。

wnm23的专栏 5221

Effective C++ 读书笔记 Item9 绝不在构造和析构过程中调用 virtual 函数

假如你在为某证券公司设计股市交易软件,需要有一个类用来表示股市交易: class Transaction{ //股市交易的基类 public: Transaction(); virtual void logTransaction() const =0; //该函数用来记录交易历史,是一个纯虚函数 .....

Vermont_的博客 194

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7709

第一届“龙信杯”电子数据取证竞赛Writeup

第一届“龙信杯”电子数据取证竞赛Writeup

toto的博客 1万+

Effective C++ 读书笔记 条款09:绝不在构造和析构过程中调用virtual函数

Core List 1.  构造和析构函数中调用virtual函数

524

15、导频辅助信道估计:挑战与解决方案

本文探讨了导频辅助信道估计在双选择性信道中的挑战,分析了传统方法的局限性,并提出了一种新的导频子载波结构。该结构综合考虑相干频率带宽与相干时间,通过动态移动导频位置并结合时间与频率分集,提升了高速移动环境下的信道估计性能。文章还讨论了其硬件实现、系统开销及兼容性等实际问题,并展望了优化策略、降低开销及与其他技术融合的未来研究方向。

o4p5q6r7s的博客 103

effective C++ 09_绝不在构造和析构过程中调用virtual函数 读书笔记

作者指出的根本原因:在derived class对象的base class构造期间,对象的类型是base class而不是derived class。

qq_22594413的博客 152

华为OD机试2025C卷 - CPU调度策略 (C++ & Python & JAVA & JS & GO)

华为OD机试 2025C卷 CPU调度策略,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1296

Transformer实战(2)——循环神经网络详解

循环神经网络 (Recurrent neural networks, RNN) ,RNN 是在文本输入中广泛使用的神经网络。RNN 非常灵活,已被用于解决诸如语音识别、语言建模、机器翻译、情感分析和图像字幕等问题。RNN 利用输入的序列特性,序列输入可以是文本、语音、时间序列以及任何其他元素的出现取决于其前面元素的序列。在本节中,我们介绍了 RNN 及其变体,并学习如何使用 TensorFlow 进行实现。

盼小辉丶的博客 1万+

《Effective c++》读书笔记 2.构造,析构,赋值

5.了解c++默默编写并调用哪些函数 空类中 如果自己没有声明,编译器就会声明一个default构造函数,一个copy构造函数,一个copy assignment操作符,一个析构函数 不能生成operator = 的条件 1.内含reference成员和内含const成员(c++不允许reference和const改变) 2.基类copy assignment为private 6.若不想使用编译器自动生成的函数,就该明确拒绝 拒绝的方法: ●将成员函数声明为private而且故意不实现它们 ●继承专门为了阻

ziggy7的博客 177

Challenge 4 - OSCP A

在c盘下发现一个windows.old,在里面可以找到SYSTEM和SAM文件,下载到本地,利用samdump2解密发现没解出来,再来试试pwdump.py(https://github.com/CiscoCXSecurity/creddump7)得到压缩包密码bludecode,解压之后发现一个比较特殊的文件configuration.php,里面有两个类似密码的字符串。登录之后在/opt/backups/下发现几个特殊文件,其中sitebackup3.zip是个正常的压缩包。但是这个压缩包是有密码的。

羽的博客 5784

Effective C++读书笔记(二)——构造/析构/赋值运算

目录 1.为多态基类声明virtual析构函数 2.别让异常逃离析构函数 3.绝不在构造和析构过程中调用virtual函数 4. 令operator= 返回一个reference to *this 5.在operator=中处理“自我赋值” 1.为多态基类声明virtual析构函数 例如工程模式,创建一个base class指针,指向生成的derived class对象。 class TimeKeeper { public: TimeKeeper(); ..

baidu_15952103的博客 272

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Effective C++读书笔记之构造/析构/赋值运算

本文主要概括一下Effective C++一书中的构造/析构/赋值运算章节的内容,并且做简要的应用分析。

张小酒的博客 497

深度学习工具包 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++(02)构造/析构/赋值

Effective C++ 读书笔记

LogM的博客 176

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Effective C++读书笔记(2)——构造、析构、赋值运算

C++默认调用的函数 当你写一个空类的时候,编译器会默认声明一个编译器版本的copy构造函数,copy assignment操作符、一个析构函数和默认构造函数(都是inline的与public)。 //当声明一个空类的时候编译器默认声明以下函数 //当函数调用的时候,编译器才会创建这些函数 class Empty(){ public: Empty(){...}; //默认构造函数 ...

qq_41701244的博客 170

Effective C++ 读书笔记(2.构造、析构、赋值运算)

条款05:了解C++默认编写并调用哪些函数 编译器会为一个空类声明:copy构造函数、copy assignment操作符和一个析构函数,如果你没有声明任何构造函数则编译器会为你声明一个default构造函数。

weixin_42699130的博客 213

Effective C++读书笔记(持续更新)

protected:private:​// 为阻止HomeForSale对象被拷贝,需要继承Uncopybale​。

XT3121000506的博客 1648

《Effective C++》读书笔记 2.构造/析构/赋值运算

构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 编译器自动生成copy构造函数、copy assignment操作符、default构造函数(没有声明任何构造函数的时候) 这些函数都是public且inline的 注意,只有在这些函数被需要(被调用)的时候它们才会被编译器创造出来 关于copy构造函数和copy assignment操作符=,只有当生出的代码合法且有适当机会证明它有意义,编译器才会自动生出。比如成员变量里面有引用或者const,无法赋值,编译器没法解决,就不生成 条款06:

Estrike的博客 215

effective C++读书笔记2

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

! 512

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

提前定义变量,有可能导致变量并没有使用(如中间抛异常了),而平白多了一个构造和析构成本。但是循环怎么办?// 方式AWidget w;i < n;...// 方式Bi < n;++i) {...做法A:1个构造 + 1个析构 + n个赋值操作做法B:n个构造函数 + n个析构函数打破本条款选择A的依据:(1)你知道赋值成本比“构造+析构"成本低。(2)你正在处理代码中效率高度敏感的部分。否则你应该使用做法B,维持变量尽可能在使用时定义的原则。请记住。

m0_74795952的博客 946

Effective C++读书笔记之九:绝不在构造和析构过程中调用virtual

Item 09:Never call virtual

极客时代 790

《Effective C++》读书笔记(二):构造/析构/赋值运算(条款05~条款12)

读《Effective C++》的读书笔记,加上了自己的一些代码的验证和思考。条款05到条款12。

wjmhlh的博客 289

《Effective C++》读书笔记第二章——构造/析构/赋值运算(Constructors, Destructors, and Assignment Operators)

条款05:了解C++默默编写并调用哪些函数 (Know what functions C++ silently writes and calls) 编译器可以暗自为类创建默认构造函数、拷贝构造函数、拷贝赋值操作符,以及析构函数。 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 (Explitcitly disallow the use of compiler-generated fun...

哈哈哈哈嘿嘿嘿 315

【读书笔记】【Effective C++】构造/析构/赋值运算

【读书笔记】【Effective C++】构造/析构/赋值运算。

做一些记录工作。 205
上一篇: Effective C++读书笔记之别让异常逃离析构函数
下一篇: Effective C++读书笔记之令operator= 返回一个reference to *this
anthit
博客等级 码龄21年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值