C++ 中的类和结构体

C++ 中的类(Class)和结构体(Struct)是两种用户定义的数据类型,它们可以包含数据和函数来表示现实世界中的对象和行为。这两种类型的主要区别在于它们的成员访问权限以及继承时的默认访问权限。

在最基本的形式下,类和结构体的定义如下:

C++ 结构体:

struct MyStruct {
    // 成员默认为公有(public)
    int data;
    void func() {
        // Do something
    }
};
  • 结构体的成员默认访问权限是公有(public)。也就是说,除非明确地指定,否则结构体内的成员都是公有的,它们可以在程序中的任何位置被访问。

C++ 类:

class MyClass {
    // 成员默认为私有(private)
    int data; // 私有成员
public:
    void func() {
        // Do something
    }
};
  • 类的成员默认访问权限是私有的(private)。也就是说,除非你明确地将成员标记为公有(public)或保护(protected),否则它们无法被类的外部代码直接访问。

除了默认的访问权限不同,结构体和类在C++中几乎是可以互换的。两者都可以用来实现封装(encapsulation)、继承(inheritance)和多态(polymorphism)等面向对象编程(OOP)概念。

继承:

当使用结构体或类继承另一个结构体或类时,它们的默认访问权限也不同:

  • 继承自类的新类(class)默认是私有继承(private)。
  • 继承自结构体的新结构体(struct)或类(class)默认是公有继承(public)。

例子:

// 基类
class BaseClass {
    //... 基类成员
};

// 派生类,默认私有继承BaseClass
class DerivedClass : BaseClass {
    // ... 派生类成员
};

在这种情况下,如果不指定继承类型(比如 public),DerivedClass 默认以私有方式继承 BaseClass

// 基结构体
struct BaseStruct {
    // ... 基结构体成员
};

// 派生结构体,默认公有继承BaseStruct
struct DerivedStruct : BaseStruct {
    // ... 派生结构体成员
};

在这种情况下,DerivedStruct 默认以公有方式继承 BaseStruct

#include <iostream>
#include <string>

// 定义一个结构体Person
struct Person {
    std::string name;
    int age;

    // 结构体构造函数
    Person(std::string name, int age) : name(name), age(age) {}

    // 结构体可以包含函数
    void introduce() {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};

// 定义一个类Employee,它公有继承Person
class Employee : public Person {
    std::string position; // 默认是私有成员
public:
    // Employee的构造函数
    Employee(std::string name, int age, std::string position)
        : Person(name, age), position(position) {}

    // 公有成员函数
    void work() {
        std::cout << name << " is working as a " << position << std::endl;
    }

    // 演示访问控制
    void showPosition() {
        std::cout << "Position: " << position << std::endl;
    }
};

int main() {
    // 创建Person实例
    Person person("A", 30);
    person.introduce(); // 可以访问,因为introduce()是公有的

    // 创建Employee实例
    Employee employee("B", 25, "Developer");
    employee.introduce(); // 可以访问,继承自Person
    employee.work(); // 可以访问
    employee.showPosition(); // 可以访问

    return 0;
}
Name: A, Age: 30
Name: B, Age: 25
B is working as a Developer
Position: Developer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Time_zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值