c++使用总结

(1)纯虚函数的使用

virtual float Area(void) const = 0;

= 0,表示该函数为纯虚函数,持有该函数的类为抽象类,不可以实例化,派生类必须实现基类中的纯虚函数,一般用该方法来定义接口。

(2)为什么要使用虚函数和纯虚函数?

定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。

(3)出现__cxa_pure_virtual的情况

1:线程切换的时候, 一个清空了虚函数表,另外一个线程却正要用
2:构造函数调用虚函数也会出这个问题
3:垂悬指针也会出现这个现象,父类指针指向子类实例,子类被释放后,用父类指针调用

(4)为什么=,[]等运算符只能重载成类的成员函数

1:对于赋值操作符(=)--比较特别,因为任何类如果不提供显示的拷贝赋值(即重载=),则编译器会隐式地提供一个。这样的话,如果你再通过友元声明,进行全局的定义会造成调用二义性(即使允许,编译也会出错)。

2:对于所有楼主提到的操作符(=,[],(),->),只能声明为成员函数是为了避免不合法的书写通过编译(这是推测出的原因,更深层的可能要研究 C++ 的设计了)。这涉及到 C++ 中类型的隐式转换。下面通过代码例子说明:

#include <iostream>

class X 
{
public:
    X(){}
    X(int){} // int 类型可以被隐式转换成 X
    friend bool operator<(const X& x1, const X& x2) { return true; } // 只是测试,无意义
};

class Y 
{
public:
    Y(){}
    Y(int){} // int 类型可以被隐式转换成 Y
    bool operator<(const Y& y) const { return true; } // 只是测试,无意义
};

int main()
{
    X x;
    if(1 < x) // 合法,使用友元重载函数,1 可以被隐式地转换为 X 类型 --友元函数的第一个参数
    {}

    Y y;
    if(1 < y) // 不合法,使用成员重载函数,函数的第一个参数是 const *this,1 不能被隐式转换
    {}

    return 0;
}

由上面的代码可以知道,如果将 =,[],(),-> 进行友元全局重载,那么就会出现 1=x; 1[x]; 1->x; 1(x); 这样的合法语句(起码编译器认为这些是合法的)

5operator用法详解

参考
https://blog.csdn.net/skdkjzz/article/details/45872801

猜你喜欢

转载自blog.csdn.net/ktigerhero3/article/details/80417645