Effective C++ 笔记2

effective modern C++ 学习笔记2 有一个形参中没有任何一个具备std::initializer_list型别的构造函数,允许你明确初始的容器大小以及每个元素的初始值,但是它也有一个std::initializer_list构造函数允许你明确初始的容器值。一个概念上的可变参的。nullptr 的类型实际上是 std::nullptr_t ,在一个漂亮的循环下, std::nullptr_t 定义为 nullptr 的类型。std::nullptr_t 可以隐式的转换为所有的裸指针类型,这使得 nullptr 表现的像可以指向任意类型的指针。 阅读详情

本文内容基本来自于《Effective C++》一书,为学习后的笔记,以便温故。


《Effective C++ 》第 2节  构造/析构/赋值运算符

(1)条款05: 了解C++默默编写并调用哪些函数

    C++编译器会为一个空类声明一个copy构造函数,一个copy assignment操作符和一个析构函数。此外,如果没有声明构造函数,编译器会为你声明一个default构造函数。所有这些函数都是public inline。

     default构造函数和析构函数用来存放“隐藏幕后”的代码。copy构造函数和copy assignment操作符只是单纯的将来源对象的每一个non-static成员变量拷贝到目标对象。但是要注意三点:

    a:如果打算在一个内含reference成员的class支持赋值操作,你必须自己定义copy assignment操作符。因为C++不允许让reference改指向不同的对象

    b:若类中使用const成员,因为更改const成员是不合法的。所以也需要自已实现copy assignment操作和copy构造函数

    c:如果某个base classes将copy assignment操作符声明为private,编译器将拒绝为其derived classes生成一个copy assignment操作符。

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

     为了驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现,使用像Uncopyable这样的base class也是一种做法。

    Uncopyable作为base class方法

    class Uncopyable{

      protected:

          Uncopyable(){};

          ~Uncopyable(){};

     private:

        Uncopyable(const Uncopyable&);

      Uncopyable& operator= (const Uncopyable&);

    };

    其他的类private继承Uncopyable

    class HomeForSale: private Uncopyable{

          ............/////////     

};

   这样就不能对HomeForSale使用copy构造函数和copy assignment操作符了

(3)条款07:为多态基类声明virtual析构函数

     C++明确指出:当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义,实际上执行时通常发生的是对象的derived成分没有被销毁。只执行了其base class 的析构函数,造成了局部销毁资源的状况。从而造成了内存泄露。

    解决这个问题的做法很简单:给base class一个virtual析构函数。此后删除derived class对象就会如你想要的那般。它会消除整个对象,包括base class成分。如:

   class BaseClass{

    BaseClass(){};

    virtual  ~BaseClass(){ cout<<"~BaseClass()"<<endl;}  

};

  class DrivedClass: public BaseClass{

  DrivedClass(){} 

 ~DrivedClass(){ cout<<"~DrivedClass()"<<endl;}  

};

BaseClass* pBaseClass = new DrivedClass();

delete pBaseClass; //现在不会出现局部删除的现象。

如果class不含virtual函数,通常表示它并不意图被用作一个base class。当class不企图被当做base class,令其析构函数为virtual函数往往是个馊主意。这样做会使得对象会携带某些不必要的信息,用来运行期决定哪一个virtual函数该被调用。 

   classes的设计目的如果不是作为base classes使用,或者不是为了具备多态性质,就不该声明virtual析构函数。

(4) 条款08:别让异常逃离析构函数

       在析构函数中出现异常,会导致程序过早的结束,造成某些资源的泄漏,例如:应该delete某些对象,但是没有执行到。

      a:析构函数绝对不要吐出异常,如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或者结束程序(abort)

      b:如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数执行该操作。

(5) 条款09:绝不在构造和析构过程中调用virtual函数

       base class在构造函数或者析构函数中如果使用vritual函数,那么该base class调用的也是自身的virtual函数,而不会降级为derived class 相应的virtual函数。

      记住这类调用从不下降至derived class。

(6)条款10:令operator= 返回一个reference to *this

     注意,这只是一个协议,并不一定必须遵循它。然而这分协议被所有内置类型和标准程序库提供的类型如:string ,vector, complex等共同遵守。

(7)条款11:在operator=中处理“自我赋值”

      确保当对象自我赋值时operator=有良好行为,其中技术包括比较“来源对象”和“目标对象”的地址,精心周到的语句顺序,以及copy-and-swap

      确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

(8)条款12:复制对象时勿忘其每一个成分

      copy函数应该确保复制“对象内的所有成员变量”及“所有base class成分”

     不要尝试以某个copying函数实现另一个copy函数,应该将共同机能放进第三个函数中,并由两个copying函数共同调用。


C#与西门子PLC通讯——新手快速入门 本文基于C# .Net Core和西门子博图TIA Portal V17搭建。由于手边没有西门子PLC实物,所以采用S7-PLCSIM Advanced V4.0作为模拟PLC,以实现0成本完成通讯测试实例。这篇入门笔记解决了新手第一次上手实践时遇到的坑,并且有意忽略了实际项目中会遇到的逻辑交互和更多的数据格式问题。 阅读详情

相关推荐

嵌入式系统启动流程解析:ROM Code、Bootloader与启动代码的协同工作

本文深入解析嵌入式系统从通电到运行的完整启动流程,详细阐述了ROM Code、Bootloader与启动代码三者如何像接力赛般协同工作。ROM Code作为芯片固化的初始引导程序,负责硬件自检并加载Bootloader;Bootloader作为系统总指挥,初始化关键硬件并加载操作系统内核;启动代码则为C语言运行环境铺平道路。理解这三者的分工与协作,是进行系统移植和解决启动问题的关键。

dd012的博客 553

《Effective C++ 2nd Edition》读书笔记

《Effective C++ 2nd Edition》读书笔记 Section 1: 改变旧有的C习惯( Shifting from C to C++ )       Item 1: 尽量以 const 和 inline 取代 #define           Perfer const and inline to #define.      Item 2: 尽量以 取代           

lxu的专栏 1086

S/4中的16种特殊库存类型

S/4中的16种特殊库存类型

yanzibing99的博客 1万+

Effective cpp 读书笔记2

05.了解C++默默编写并调用哪些函数 06.若不想使用编译器自动生成的函数,就该明确拒绝 07.为多态基类声明virtual析构函数 08.别让异常逃离析构函数 09.绝不在构造和析构过程中调用virtual函数 10.令operator=返回一个reference to *this 11.在operator=中处理“自我赋值” 12.复制对象时勿忘其每一个成分

GZGlenn的博客 873

实战指南:基于华为Ascend NPU的大模型W8A8量化调优与精度提升

本文提供了一份基于华为Ascend NPU进行大模型W8A8量化的实战调优指南。详细介绍了从环境搭建、使用msmodelslim框架进行基础量化,到通过离群值抑制、校准集优化和量化回退等关键技术提升精度的全流程。旨在帮助开发者在华为NPU硬件上实现模型推理的显著加速,同时有效控制精度损失。

weixin_29227425的博客 271

第四章 汇川技术InoProShop入门之串口自由协议解读

摘要: 串口自由协议是工业自动化中针对特定需求设计的自定义通信协议,具有高度灵活性和针对性,适用于小型设备、实时控制等场景。其核心包括自定义帧结构(起始符、地址码、数据区、校验位等)和通信规则(波特率、交互机制)。相比标准协议,自由协议效率更高但兼容性弱,设计时需注重可靠性、效率和可扩展性,适用于定制化或高实时性需求,如传感器数据采集或老旧设备改造。典型应用需平衡精简帧结构与抗干扰能力,同时预留扩展空间。

zyfucking2010的博客 2214

【Effective C++笔记 (1-2)】

优先使用const和enum:在需要定义常量时,优先选择const对象或enum,以获得类型安全性和更好的作用域控制。使用inline函数:对于需要类似宏功能的场景,使用inline函数替代#define宏,可以避免多次求值和类型不安全的问题,同时保持性能优势。

limingkang1的博客 835

WeDetect:基于视觉-语言检索的目标检测新范式

目标检测正从传统回归与分类耦合范式,向开放、灵活、可扩展的多模态检索范式演进。检索式检测(Retrieval-based Detection)将检测任务重构为视觉特征与文本语义的联合匹配过程,依托候选框索引库与双塔架构,天然支持开放词汇、零样本识别与小目标定位。其技术价值在于解耦空间感知与语义理解,消除NMS与anchor匹配等冗余计算,显著提升推理效率与跨场景泛化能力。典型应用场景包括工业质检中的缺陷新增识别、遥感图像小目标检测、低光照鲁棒视觉系统等。WeDetect正是这一范式的代表性实现,深度融合视觉

weixin_30878501的博客 361

effective C++读书笔记2

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

! 512

17、神经网络训练算法与高阶模糊Cohen - Grossberg神经网络稳定性分析

本文介绍了一种新的数据驱动算法用于神经网络训练,该算法继承三次样条权重函数的优点,具有简单架构和良好泛化性能,并通过并行机制显著提升训练速度。同时,研究了高阶模糊Cohen-Grossberg神经网络(HOFCGNN)在可变及无界延迟下的稳定性,利用M矩阵理论和向量Lyapunov函数方法,证明了系统平衡点的存在性、唯一性和全局指数稳定性。研究成果为神经网络的高效训练与稳定应用提供了理论支持和技术路径。

b9c0d的博客 147

YOLOv8改进 | 注意力机制 | 添加HAttention(HAT)超分辨率重建助力小目标检测 (全网首发,超分辨率检测)

本文给大家带来的改进机制是HAttention注意力机制,混合注意力变换器(HAT)的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。通道注意力关注于识别哪些通道更重要,而自注意力则关注于图像内部各个位置之间的关系。HAT利用这两种注意力机制,有效地整合了全局的像素信息,从而提供更为精确的结果(这个注意力机制挺复杂的光代码就700+行),但是效果挺好的也是10月份最新的成果非常适合添加到大家自己的论文中。⭐⭐⭐⭐⭐(最新的改进机制)

Snu77的博客 1万+

笔记2 Effective C++

知识点 mutable class CTextBlock { public: ... std::size_t length() const; private: char* pText; std::size_t textLengeh; //最近一次计算的文本区块长度 bool lengthIsValid; // 目前的长度是否有效 }; std::size_t CTextBlock::length() const { if (!lengthIsValid) { textLengeh

一个有梦想,有追求,有抱负的人 173

ZYNQ 7020 之 FPGA知识点重塑笔记一——串口通信

通信方式一般分为串行通信和并行通信。并行通信是指多比特数据同时通过并行线进行传送。这种传输方式通信线多、成本高,故不宜进行远距离通信,通常传输距离小于 30 米。串行通信是指数据在一条数据线上,一比特接一比特地按顺序传送的方式。这种运输方式通常节省传输线,大大降低使用成本,但数据传送速度慢。综上可知,串行通信主要应用于长距离、低速率的通信场合。本次实验我们主要讲解下串行通信。串行通信一般有2种通信方式:同步串行通信和异步串行通信。同步串行通信。

m0_51430584的博客 3094

【Effective C++】阅读笔记2

Effective C++学习笔记

gma999的博客 1658

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

effective cpp 读书笔记2

当你用到多态时,务必把析构函数做成虚函数以前知道子类的析构函数会自动调用父类的析构函数,然而今天却发现不总是这样。当你用基类的指针指向派生类时,然后delete这个指针时,有可能就不会调用派生类的析构函数。看代码#include <stdio.h> class A{ public: ~A(){ printf("A deconstructor\n"); } }; cl

stockholmrobber的博客 389

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《Effective Modern C++》笔记2

本文是《Effective Modern C++》笔记的后半部分

weixin_57209831的博客 295

深度学习工具包 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++ 阅读笔记之Chapter2

前言 大家好,我是雨墨,我深知好记性不如烂笔头的道理,所以在阅读的时候都尽量写读书笔记,方便日后复习,当然笔记并不能代替书籍上的内容。希望我的笔记也能帮助到大家,如果我的笔记有什么问题,欢迎大家给小老弟纠错~ 条款五总结 当一个空类被创建对象的时候,编译器会为其声明一个默认的构造函数、拷贝构造函数、析构函数、拷贝赋值; 只有当类没有声明这些函数的时候,编译器才会主动做这些事,但是做的事情可能和你想象中的有些不一样; 如果想在一个含有 reference 成员的 class 中支持赋值操作,你必须自己定义

qq_51387669的博客 247

Effective C++之条款1,条款2笔记整理

有人说C++程序员可以分为两类,读过Effective C++的和没读过的。世界顶级C++大师Scott Meyers 成名之作的第三版的确当得起这样的评价。 本书并没有你告诉什么是C++语言,怎样使用C++语言,而是从一个经验丰富的C++大师的角度告诉程序员:怎么样快速编写健壮的,高效的,稳定的,易于移植和易于重用的C++程序。 本笔记共有55个条款,从多个角度介绍了C++的使用经验和应遵循

hellokazhang的博客 2359

《Effective C++》笔记汇总_思维导图 chap2

2.构造/析构/赋值运算 下面是思维导图的截图,资源发在Github上了,需要的朋友自取 《Effective C++》chap2:构造/析构/赋值运算 一些话儿 本人水平有限,如果笔记中有错误或是遗漏的地方,还请大家体谅。 这份笔记花了小生非常多的时间与精力,如果能帮到你对C++的学习,点个赞即可! ...

qq_43596544的博客 243

Effective C++笔记2

1、了解C++默默编写并调用哪些函数 *至于copy构造函数和copy assignment操作符,编译器创建的版本只是单纯地将来源对象的每一个non-static 成员变量拷贝到目标对象。注意,编译器产出的析构函数是个non-virtual。 *如果你打算在一个"内含reference 成员"的 class 内支持赋值操作 (assignment) ,你必须自己定义 copy ass

ljianhui的专栏 979

Effective C++【学习笔记】Item2

Accustoming yourself to C++ ------------------------------------------------------------------------------------ Item2: Prefer consts, enums, and inlines to #defines. 换句话说: Prefer the compiler to ...

cyy2learn的博客 324

基于Flask与微信小程序的企业员工绩效薪资管理系统全解析

Python在企业级应用开发中占据重要地位,Flask作为轻量级Web框架,常被用于快速搭建内部管理系统。它的核心原理是以RESTful API提供数据服务,配合前端/小程序进行前后端分离交互。这种架构的技术价值在于灵活、轻量、低门槛,能够显著提升中小企业人事管理效率。典型应用场景包括员工信息管理、绩效考核流程、薪资核算与工资条查询等;微信小程序作为移动端载体,凭借助手即开即用和消息触达优势,成为企业移动办公的常见入口。基于Flask与微信小程序的企业员工绩效薪资管理系统,围绕这些核心需求展开,从数据库设计

weixin_34293141的博客 378

Effective C++ 读书笔记(2)

第二章 构造、析构、赋值运算 本章共有如下8个条款: 条款5 了解 C++ 默默编写并调用哪些函数 条款6 若不想使用编译器自动生成的函数,就该明确拒绝 条款7 为多态基类声明 virtual 析构函数 条款8 别让异常逃离析构函数 条款9 绝不在构造和析构过程中调用 virtual 函数 条款10 令 operator= 返回一个 reference to *this 条款11 在 opera...

SunnyZhang在奋斗的博客 430

读书笔记系列2:《More Effective C++》

More Effective C++书摘及代码示例

千里之行,始于足下 1440

Effective C++ 学习笔记2

文章目录const的作用及使用细节const在迭代器中的使用const修饰函数返回值和函数参数const 成员函数const的两个派别派别一派别二参考资料 const的作用及使用细节 const能在编译器阶段保证对象不能被修改。 const能对全局变量、局部静态变量,类属成员变量,指针进行约束。 char greeting[]="Hello"; char* p=greeting; const char*p=greeting;//指针所指的内容是常量 char* const p=greeding;//指针

guerbuzhang的博客 929

Effective C++读书笔记 Part2

Effective_CPP_Note2 Effective C++ Notes Part II Part II. Constructors, Destructors and Assignment Operators 5. Know what functions C++ silently writes and calls. (C++ 03) If any of de...

a594896082的博客 308
上一篇: Effective C++ 笔记1
下一篇: setjmp和longjmp
csc_csc_csc
博客等级 码龄15年 169粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值