CPP_NOTE

enum class foo{min,mid,max};//必须使用枚举名使用符号:foo::min。且不能隐式转换类型。
enum class:short foo{};可以指定枚举的底层类型是short。

Stack a = stack();//这种方式是先声明一个匿名对象然后通过拷贝构造函数复制给a,匿名对象随后调用析构函数释放。

strlen() //返回字符串长度但不包括结尾的空字符



  • 非成员函数重载操作符时,第一个参数是左参数

  • 什么时候使用拷贝构造函数什么时候使用赋值函数?

Classname p;
Classname a=p;//拷贝构造函数;如果拷贝构造函数被声明为 explicit 则这种方式不被允许
Classname b;
b=p;//赋值函数
  • 构造函数初始化列表的初始化顺序是按照元素声明的顺序而不是在初始化列表中的顺序

  • 宏定义 # 的作用 -- 转为字符串

#define  strcpy__(dst, src)      strcpy(dst, #src)
strcpy__(buff,abc)  //相当于 strcpy(buff,“abc”)
  • 重载类型转换函数, operator typename();//不能有返回值和参数, 更好的方式是定义一个成员函数来完成这个事不要使用这个特性.

  • explicit 禁止隐式的使用 eg:

classname a=10 这种方式隐式的调用构造函数
//还有隐式的类型转换。比如class定义了 explicit double的转换函数,
double a=11.0+class; //这种方式将不被允许,不适用explicit时这里class将会隐式的调用转换函数转 double
double a=11.0+double(class) ; //而可以使用显示的方法
  • 类继承
派生类不能直接访问基类的私有成员。只能通过基类提供的公共接口间接访问。
所以派生类的创建需要先使用基类的构造函数初始化基类的私有成员,然后再调用派生类的构造函数
析构的时候先调用派生类的析构函数再调用基类的构造函数。

基类指针、引用可以指向派生类对象但是只能调用基类的方法。
派生类指针、引用不可以指向基类。

虚函数:
首先看看不用虚函数会出现什么情况: 比如基类里有个显示函数,而由于派生类里新加了成员,所以基类的显示函数就不再适合新的派生类了,于是我们在派生类里声明一个新的显示函数,返回值名称啥的都和基类里的函数一样,思考一下现在会出现什么情况?会报错?不会,因为他们两个函数在不同的类中,不会产生冲突。实际情况是当我们使用派生类调用这个函数时会调用派生类自己的函数,变量也是同样的情况。
那使用指针或引用的时候呢?因为我们知道基类的指针或引用可以指向派生类对象,所这里有两种情况,使用派生类型的指针调用函数时会调用派生类的函数,而使用基类类型指针调用函数时会调用基类的函数。
这里就是虚函数与非虚函数不同点,如果调用的是虚函数,则不会根据指针或引用类型来判断使用哪个函数,而是根据指针或引用指向的对象的类型来判断调用的函数。也就是说即使是基类的引用但是引用的对象是派生类的,通过引用调用的函数也是派生类的。
这种特性感觉在函数参数是类的引用或指针型的地方会很有用,只需要编写一个接受基类引用的接口就可以根据不同的对象产生不同的行为。

析构函数通常是虚函数。

一个函数被声明为虚函数后,其派生类的同名函数自动成为虚函数,但显示的声明更让人易懂。

编译器对非虚函数采用静态联编。

重新定义非虚函数,即使参数不同也不会生成重载,而是派生类的方法覆盖基类的方法。

虚函数允许我们重新定义一个函数,函数的声明(返回值,函数名,参数)不能变。列外:返回值是类的引用或指针时可以改为派生类的引用或指针。返回类型协变。
  • class 友元函数定义顺序问题
问题: TV类中声明TB类的成员函数为友元函数时,TB类的声明应该在TV类的声明之前
而TB的这个成员函数访问了TV类中的成员,这意味着TV应该在TB声明前声明,
答案: 使用前置声明解决这个问题 : class TV;

实践:
有一个类声明如下
class apls{
   friend ostream& operator<<(std::ostream& os,apls x);
};
可以看到,它有一个友元函数,由于该函数使用了apls这个类,所以因该定义在class后面,而友元函数的声明又用到了这个函数,所以声明在class前面,
ostream& operator<<(std::ostream& os,apls x);
class apls{
   friend ostream& operator<<(std::ostream& os,apls x);
};
ostream& operator<<(std::ostream& os,apls x)
{do something'}
而我们看到由于声明时用到了apls这个类,所以需要将类前置声明在这个前置声明之前
class apls;
ostream& operator<<(std::ostream& os,apls x);
class apls{
   friend ostream& operator<<(std::ostream& os,apls x);
};
ostream& operator<<(std::ostream& os,apls x)
{do something'}


  • C++11

image

posted @ 2024-05-10 10:59  天刚刚破晓  阅读(14)  评论(0)    收藏  举报