C++中的struct

网上很多视频中的知识点都比较旧,很多东西也是自己后来多了解了点才恍然大悟。

虽然各种编程语言一直有在更新标准,例如C++的标准从98到11再到14。

虽然C++11已经被大部分编译器支持了,遗憾的是很多视频的授课内容依旧停留在98标准,甚至不少直接就用了“C语言式”的方法来传授C++的知识,实在有点囧。

————————————————————cut-off line——————————————————————————————

在C++中,struct其实和class一样,是一个定义类的关键字,C++中的struct和C语言中的struct是大不相同的。

在C++中,令我咋舌的是,struct和class唯一的区别就是默认访问权限不同!而远不止C语言的结构体概念,所以建议C++中不要引入“结构体变量”,都统称为“类”。

例如,下面的几个简单的代码所要表示的内容都是等价的:

1. struct 定义类,默认的访问权限是public

struct ClassName01 {
    ClassName01() {}
    ~ClassName01() {}

    int a;
    double b;
};


2.

struct ClassName02 {
public:
    ClassName01() {}
    ~ClassName01() {}

    int a;
    double b;
};

3. class 定义类,默认的访问权限的private

class ClassName03 {
public:
    
### C++ 中 `struct` 的使用方法和特点 #### 结构体定义与初始化 在 C++ 中,`struct` 不仅能像 C 一样作为数据集合存在,还支持成员函数、访问控制符以及继承等面向对象编程特性。下面是一个简单的例子来展示如何定义并初始化一个结构体: ```cpp #include <string> struct Person { std::string name; int age; void introduce() const { std::cout << "My name is " << name << ", I am " << age << " years old." << std::endl; } }; int main(){ // 初始化方式一:直接赋值 Person person1{"Alice", 30}; // 初始化方式二:默认构造后设置属性 Person person2; person2.name = "Bob"; person2.age = 25; person1.introduce(); person2.introduce(); return 0; } ``` 此代码片段展示了两种不同的初始化方法,并且包含了成员函数用于打印个人信息[^1]。 #### 成员函数和支持的操作符重载 除了基本的数据存储外,C++ 还允许向 `struct` 添加行为——即成员函数。这使得它可以执行特定的任务或计算。此外,还可以实现操作符重载以便更自然地处理自定义类型的实例之间的交互。 ```cpp struct Point { double x, y; Point operator+(const Point& other) const{ return {this->x + other.x, this->y + other.y}; } bool operator==(const Point& other)const{ return (this->x == other.x && this->y == other.y); } }; Point p1{1.0, 2.0}, p2{3.0, 4.0}; auto sum_p = p1 + p2; // 使用加法运算符 bool equal = (p1 == p2); // 判断两个点是否相等 ``` 这段程序说明了怎样创建带有算术运算符(`+`)和比较运算符(`==`)的简单二维坐标类[^2]。 #### 继承机制 尽管通常认为只有 `class` 支持多态性和虚函数等功能,但实际上,在 C++ 中 `struct` 同样能够参与单继承关系,默认情况下基类为公有(public),这意味着派生出来的子结构体会自动获得父级所有的公共接口。 ```cpp struct Shape { virtual double area() const = 0; // 抽象纯虚函数 }; struct Circle : public Shape { private: float radius_; public: explicit Circle(float r):radius_(r){} double area() const override final { return M_PI * pow(radius_, 2); } }; Shape* shape_ptr = new Circle(7.8f); std::cout<<shape_ptr->area()<<'\n'; // 输出圆面积 delete shape_ptr; ``` 上述案例构建了一个抽象图形基类及其具体圆形衍生版本,体现了基于 `struct` 实现继承的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值