现代C++对struct的扩展

Last Updated: 2023-12-25 07:47:28 Monday

-- TOC --

C语言的struct,只是一块包含各种数据的内存。在现代C++中,struct已经扩展成跟class差不多的功能,即struct就是在定义一个类。

在C++中我们可以看到struct和class的区别并不是很大,两者之间有很大的相似性。那么为什么还要保留struct,这是因为C++是向下兼容的,兼容C。

从内存块到对象

struct在C语言中,是一块内存,而在C++中,它是一个对象。

在C++中定义struct,可以省略typedef关键词。

下面这个.c文件,用gcc编译不过,但是用g++可以编译通过:

#include <stdio.h>

struct ta {
    int a;
    int b;
};

int main(void) {
    ta a{};
    a.a = 1;
    a.b = 2;
    printf("%d %d\n", a.a, a.b);
    return 0;
}

以C++的视角,struct就是class,上面的代码,如果把struct替换成class,一样的:

#include <stdio.h>

class ta {
public:
    int a;
    int b;
};

int main(void) {
    ta a;
    a.a = 1;
    a.b = 2;
    printf("%d %d\n", a.a, a.b);
    return 0;
}

唯一的区别就是,struct的成员默认都是public,class成员默认都是private,因此上面的示例代码,补上public关键词。(理解public,protected和private

struct的成员函数

既然struct已经是一种class了,除了各种fundamental的数据类型定义外,还就是定义成员函数接口。

#include <stdio.h>

struct ta {
    ta(int a, int b):
        a{a},
        b{b} {
    }
    void show() {
        printf("%d %d\n", a,b);
    }
private:
    int a;
    int b;
};

int main(void) {
    ta a{1,2};
    a.show();
    return 0;
}

将a和b设置为private后,用public的show接口显示出来。以上代码对a和b的初始化,使用到了C++的初始化列表技术

struct的访问权限

既然struct已经成为了一种class,那么,就来说说它的访问权限。

回顾一下class的访问权限

struct与class的区别是:

默认权限都是public,默认public继承!(struct继承class,默认也是public)

#include <stdio.h>

struct ta {
    ta(int a, int b):
        a{a},
        b{b} {
    }
    int a;
    int b;
};

struct tb: ta {
    tb(int a, int b):
        ta{a,b} {
    }
};

int main(void) {
    tb b{3,5};
    printf("%d %d\n", b.a, b.b);
    return 0;
}

tb默认用public的方式继承ta,因此a和b都可以直接访问。

ta也可以是class,只是需要使用显式的public:

#include <stdio.h>

class ta {
public:
    ta(int a, int b):
        a{a},
        b{b} {
    }
    int a;
    int b;
};

struct tb: ta {
    tb(int a, int b):
        ta{a,b} {
    }
};

int main(void) {
    tb b{3,5};
    printf("%d %d\n", b.a, b.b);
    return 0;
}

如果把tb改成class,就要写成这样:

#include <stdio.h>

struct ta {
    ta(int a, int b):
        a{a},
        b{b} {
    }
    int a;
    int b;
};

class tb: public ta {
public:
    tb(int a, int b):
        ta{a,b} {
    }
};

int main(void) {
    tb b{3,5};
    printf("%d %d\n", b.a, b.b);
    return 0;
}

class很保守,默认都是private!struct很开放,为了兼容C也没办法,默认都是public!

本文链接:https://cs.pynote.net/sf/c/cpp/202208121/

-- EOF --

-- MORE --