摘要:
结论 C++编译器不允许这种做法,会报编译错误.(这是C++未定义的行为) C编译器如GCC一般不会报错,但返回的值不确定: 原理:函数声明时的返回类型指明,函数出栈后要去寄存器中取值(取出来的是return值的地址),函数中没有return,只是没有给这个寄存器存入合法的值。出栈后还是会去读寄存器 阅读全文
摘要:
1. 饿汉模式 使用饿汉模式实现单例是十分简单的,并且有效避免了线程安全问题,因为将该单例对象定义为static变量,程序启动即将其构造完成了。代码实现: class Singleton { public: static Singleton* GetInstance() { return singl 阅读全文
摘要:
template <class Fn, class... Args> void call_once (once_flag& flag, Fn&& fn, Args&&...args); 需要包含头文件:<mutex> 参数: (1)flag:是std::once_falg对象(定义一个该对象传进去即 阅读全文
摘要:
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明: A volatil 阅读全文
摘要:
1.禁用继承 C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final,如此,意味着继承该类会导致编译错误。 实例如下: class Super final { //...... }; 2.禁用重写 C++中还允许将方法标记为fianal,这意味着无法再子类中重写该方法。这时 阅读全文
摘要:
单参数构造函数 单参数构造函数作为隐含的类型转换符号 C++中,一个参数的构造函数(或者除了第一个参数外其余参数都有缺省值的多参构造函数),承担了两个角色。 1.用于构建单参数的类对象 2.隐含的类型转换操作符. 例如一个类A的构造函数A(int i)就是,既可以用来作为构造器,又可以实现隐式转换A 阅读全文
摘要:
编译器默认为一个类生成的默认函数 1.默认构造函数 2.默认析构函数 3.默认拷贝构造函数 4.默认赋值函数 5.移动构造函数 6.移动拷贝函数 class DataOnly { public: DataOnly () // default constructor ~DataOnly () // d 阅读全文
摘要:
虚析构函数 类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员。如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作。 通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝复制函数。 作为一个经验法则: 如果你有一个带有虚函数功能的类,则它需要一个虚析构函数,原 阅读全文
摘要:
delete p 执行了哪些步骤? delete p 是一个两步的过程:调用析构函数(释放类里边涉及new的内存),然后释放内存(类本身占的内存)。 delete p产生的代码看上去是这样的(假设是Object*类型的): delete原语可以看作如下这样一个过程: p->~Object(); p- 阅读全文
摘要:
《C++ Primer》中提到: “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。” 这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。 那么,什么是“隐式转换”呢? 上面这句话也说 阅读全文