随笔分类 -  C++

摘要:配合多线程使用。 阅读全文
posted @ 2018-03-08 23:30 guhowo 阅读(139) 评论(0) 推荐(0)
摘要:先看一段代码: 运行结果如下,情理之中,意料之内: C++创建对象的时候先创建基类部分,然后创建派生部分。析构的时候要反过来了,先释放子类部分,然后在释放父类部分。但是这里只释放了父类部分,没有释放派生类的部分。为什么呢? 原因很明确:因为之类pB是基类指针,虽然指向的是派生类,只能调用自己的函数, 阅读全文
posted @ 2018-03-08 23:05 guhowo 阅读(9475) 评论(1) 推荐(1)
摘要:volatile只保证其“可见性”,不保证其“原子性”。 执行count++;这条语句由3条指令组成: (1)将 count 的值从内存加载到 cpu 的某个 寄存器r; (2)将 寄存器r 的值 +1,结果存放在 寄存器s; (3)将 寄存器s 中的值写回内存。 所以,如果有多个线程同时在执行 c 阅读全文
posted @ 2018-03-07 22:15 guhowo 阅读(2655) 评论(0) 推荐(0)
摘要:C++的静态成员是和类关联的,它属于某个类,但是不属于某个特定的对象。静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 但是可以通过对象调用静态成员函数,虽然我们一般不会这么做: 在类外实现 阅读全文
posted @ 2018-02-26 22:28 guhowo 阅读(1897) 评论(0) 推荐(0)
摘要:从成员函数说起 在说const成员函数之前,先说一下普通成员函数,其实每个成员函数都有一个隐形的入参:T *const this。 const成员函数 声明形式是:int getValue() const; 编译器内部实现如下 表示this指针指向的内容是不可改变的,所以当试图修改val时会编译报错 阅读全文
posted @ 2018-02-26 21:55 guhowo 阅读(308) 评论(0) 推荐(0)
摘要:只允许基础指针的一个所有者。 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr)。 替换已弃用的 auto_ptr。 相较于 boost::scoped_ptr。 unique_ptr 小巧高效;大小等同于一个指针,支持 rvalue 引用, 阅读全文
posted @ 2018-02-25 11:53 guhowo 阅读(1741) 评论(2) 推荐(1)
摘要:0、异常安全 C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。 使用 raw pointer 管理动态内存时,经常会遇到这样的问题: 忘记delete内存,造成内 阅读全文
posted @ 2018-02-25 10:18 guhowo 阅读(13650) 评论(1) 推荐(1)
摘要:深拷贝和浅拷贝 所谓“深拷贝”和“浅拷贝”,各自代表不同的意义,各有所需。主要要分清值语意和引用语意。 值语意:x=y完成复制后,得到的x完全独立于y, x的改变不会影响原来的y。 引用语意:x=y完成复制后,修改x会影响y,x,y某种程度上共享了一片内存空间,存在耦合的。如下: 所以拷贝,其实都是 阅读全文
posted @ 2018-02-11 19:56 guhowo 阅读(246) 评论(0) 推荐(0)
摘要:explicit是C++中的一个关键字,只用于修饰只有一个参数的构造函数: 该关键字告诉编译器该类只能显式的转换,不能隐式(implicit)的赋值。下面介绍一下显式转换和隐式转换的区别: google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以以后想项目中我决 阅读全文
posted @ 2018-01-31 17:51 guhowo 阅读(488) 评论(0) 推荐(0)
摘要:封装性:越少的代码可以看到数据(也就是可以访问它们),越多东西被封装,越少人可以看到它。而越少的人看到它,我们就有愈大的弹性去改变他,因为我们的改变仅仅直接影响看到改变的那些人。例如,class WebBrowser可能拥有大量便利函数,某些与bookmarks书签有关,有些与cookie有关,通常 阅读全文
posted @ 2017-09-07 23:25 guhowo 阅读(322) 评论(0) 推荐(0)
摘要:在初始化类的成员的时候,我们经常会有两种选择,其一是类构造函数的成员初始化列表,其二是构造函数的函数体。那么这两者的区别又是什么,成员初始化列表的具体行为到底是什么呢? 类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员; 2.进入构造函数后在构造函数中执行一般赋 阅读全文
posted @ 2017-09-05 00:10 guhowo 阅读(946) 评论(0) 推荐(0)
摘要:如何禁止对象之间的拷贝? 将构造函数和析构函数中的任意一个设置为private,如下: 编译报错提示:Variable of type 'A' has private destructor. 我们知道,如果我们不显性的声明拷贝构造函数和重载=,那么编译器会为我们提供默认的拷贝构造函数和copy as 阅读全文
posted @ 2017-08-31 00:04 guhowo 阅读(2221) 评论(0) 推荐(0)
摘要:构造函数,顾名思义,新构造一个对象。如下调用的就是普通的构造函数: 拷贝构造函数,顾名思义,也是一种构造函数,特殊的构造函数,用一个已存在的对象初始化一个新的对象,就是拷贝构造函数。如下调用的就是拷贝构造函数,用已经存在的string s去初始化新的对象a: 拷贝构造函数声明如下:(以String为 阅读全文
posted @ 2017-08-19 23:34 guhowo 阅读(527) 评论(0) 推荐(0)