作者:不铃不铃铃不铃铃铃 | 来源:互联网 | 2023-09-12 15:29
hpp vs cpp
拷贝构造存在的前提
忽然想到这么一个有意思的话题,拷贝构造(copy ctor)或者赋值构造(assignment ctor)存在的前提是存在一个别的什么构造比如默认构造或者一个含参数的构造,总之,你不能空手套白狼。
异常会中断后续程序的进行
int main(int, char**)
{try{throw std::exception("hello exception");std::cout <<"you cannot see me!" <<std::endl;}catch(std::exception& e){std::cout <std::endl;}return 0;
}
default constructor
class A
{
public:A() { std::cout <<"A::A()" <<std::endd;}
};class B
{
public:A _a;
};int main(int, char**)
{B b;return 0;
}
要特别注意的是&#xff0c;初始化每一位成员变量用的是其成员变量自身的默认构造函数
class A
{
public:A(int) { cout <<"A::A(int)" <
编译器就是这么矫情&#xff0c;如果你提供了另外的构造函数&#xff0c;无论是含参的还是copy 构造或是赋值构造&#xff0c;它就不会在为你提供默认构造。
我们再来看一个更为典型的例子&#xff1a;
class Widget
{
public:Widget(){ cout <<"Widget::Widget()" <}class Test
{
private:shared_ptr _widget;
public:shared_ptr widget() { return _widget;}const shared_ptr widget() const { return _widget;}
}int main(int, char**)
{Test t;return 0;
}
这就牵涉到智能指针对象的构造问题了&#xff0c;调用一个其默认构造函数什么工作也不会做&#xff0c;只有当拷贝构造&#xff0c;或者赋值构造发生时&#xff0c;才会进行真正的构造工作&#xff1a;
int main(int, char**)
{Test t;shared_ptr w(new Widget);t.widget() &#61; w;return 0;
}
friend
一个类内部的有友元函数声明不是类内部的一部分&#xff0c;因此不受访问修饰的影响&#xff0c;放在一个类声明的任何位置都是等效的。
继承关系中的父类的虚函数
继承关系中的父类的非纯虚函数要给出实现。
class Base
{
public:void foo(); virtual void fooA(){} virtual void fooB(){} virtual void func() &#61; 0;
};class DerivedA :public Base
{
public:void fooA() {} void func() {}
}class DeriveB :public Base
{
public:void fooB() {}void func() {}
}int main(int, char**)
{DerivedA da;DerivedB db;da.foo(); da.fooA();da.fooB();return 0;
}