https://s3.ax1x.com/2021/01/21/s4crsU.png

BBing's Blog

C++容器操作

问题

  • 容器存指针,调用erase、clear是否会调用元素的析构函数?
    • 不会调用析构函数
  • 容器存类(非指针),是否会调用构造拷贝函数?使用erase、clear是否会调用析构函数?
    • 会调用拷贝构造函数
    • 会调用析构函数

Union可以怎么用

union 改名操作

比如以下这个类,我期望外部不仅能通过P1这个名字访问P1这个成员变量,也能通过Y/R等名字访问他的P1。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
template<typename T = UCHAR>
class __P3F__
{
public:
    union{
        struct{
            T P1, P2, P3;
        };
        struct{
            T Y, U, V;
        };
        struct{
            T R, G, B;
        };
        struct{
            T H, L, S;
        };
    };

public:
    __P3F__(const T &_P1, const T &_P2, const T &_P3) : P1(_P1), P2(_P2), P3(_P3) {}
    __P3F__() : P1(0), P2(0), P3(0) {}
    virtual ~__P3F__() {}

    VOID operator=(const __P3F__ &p3f)
    {
        P1 = p3f.P1;
        P2 = p3f.P2;
        P3 = p3f.P3;
    }
};
template<typename T = UCHAR>
using YUV = __P3F__<T>;
template<typename T = UCHAR>
using RGB = __P3F__<T>;
template<typename T = UCHAR>
using HLS = __P3F__<T>;

C++解包函数tie的用法

tie

std::tie会把变量打包成一个tuple(pair),实现变量赋值;这个行为叫做解包

1
2
3
tuple<int,double,string> t3 = {1, 2.0, "3"};
int i; double d; string s;
tie(i, d, s) = t3;

对C++bind的理解

bind的设计思想: 高内聚, 低耦合, 使被调用的函数和调用者完全隔离开来. 调用者可以根据需要任意设计接口和传参, 而被调用函数通过bind可以不经修改接口就可以兼容各种需求的变化.

在博客上查到我认为比较精髓的理解是, 使被调用的函数和调用者完全隔离开来

C++类的内存分布

问题

查看以下代码,需要了解C++类的内存布局是怎样的。标题排列按照思考顺序。 使用gdb、g++工具。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A{
public:
    int funcA(){}
    virtual int funcV(){}

public:
    int a;
    char b;
    double c;
};

class B : public A{
public:
    int funcB(){}
    int funcV(){}
public:
    char d;
};


int main()
{
    A *a = new A();
    B *b = new B();

    delete a;
    delete b;
}