C++之:struct和class的区别

一、数据封装和成员访问权限
1、结构体(struct)
在struct中,默认的成员访问权限是public。这意味着,在结构体外部,我们可以直接访问其成员变量和成员函数。下面是一个简单的例子:

struct Point {
    int x, y;
};

Point p;
p.x = 5;
p.y = 10;

2、类(class)
与struct不同,class的默认成员访问权限是private。这意味着,我们不能在类的外部直接访问其成员变量和成员函数。为了访问这些成员,我们需要使用public成员函数。下面是一个使用类的例子:

class Point {
private:
    int x, y;

public:
    // Getter methods
    int getX() const { return x; }
    int getY() const { return y; }

    // Setter methods
    void setX(int newX) { x = newX; }
    void setY(int newY) { y = newY; }
};

Point p;
p.setX(5);
p.setY(10);

二、继承
当涉及到继承时,struct和class之间的另一个区别是它们的默认访问级别。在C++中,类可以从其他类或结构体继承,反之亦然。在struct中,继承默认访问权限是public。而在class中,继承默认访问权限是private。

struct Animal {
    void eat() {
        std::cout << "Animal is eating." << std::endl;
    }
};

struct Dog : Animal {
    void bark() {
        std::cout << "Dog is barking." << std::endl;
    }
};

class Cat : Animal {
    void meow() {
        std::cout << "Cat is meowing." << std::endl;
    }
};

int main() {
    Dog dog;
    dog.eat(); // OK
    dog.bark(); // OK

    Cat cat;
    cat.eat(); // ERROR: 'eat' is a private member of 'Animal'
    cat.meow(); // ERROR: 'meow' is a private member of 'Cat'
    return 0;
}

在上面的示例中,我们定义了一个Animal结构体和一个Dog结构体,以及一个Cat类。Dog继承自Animal,并添加了一个bark()函数。而Cat也继承自Animal,并添加了一个meow()函数。
在main()函数中,我们创建了一个Dog对象和一个Cat对象。由于Dog继承自Animal的成员默认是public访问权限,所以我们可以调用dog.eat()和dog.bark()函数。但由于Cat继承自Animal的成员默认是private访问权限,所以我们不能调用cat.eat()和cat.meow()函数。

三、对象大小
在C++中,对象的大小是很重要的,它决定了对象在内存中的大小。在struct和class中,对象的大小也有一些区别。
在struct中,对象的大小等于所有成员变量的大小之和。而在class中,对象的大小还要考虑虚函数表的大小。
虚函数表是一张表格,用于存储类中的虚函数指针。每个含有虚函数的类都有一个虚函数表。当对象被实例化时,它会分配一段内存来存储虚函数表。虚函数表的大小取决于类中的虚函数数量和编译器实现。
下面是一个示例:

struct Person {
    std::string name;
    int age;
};

class PersonWithVirtualFunction {
    std::string name;
    int age;
    virtual void sayHello() {}
};

int main() {
    std::cout << "Size of Person: " << sizeof(Person) << std::endl;
    std::cout << "Size of PersonWithVirtualFunction: " << sizeof(PersonWithVirtualFunction) << std::endl;
    return 0;
}

在上面的示例中,我们定义了一个Person结构体和一个PersonWithVirtualFunction类。Person只有两个成员变量,name和age。而PersonWithVirtualFunction也有两个成员变量,name和age,但还包含一个虚函数sayHello()。

在main()函数中,我们分别输出了Person和PersonWithVirtualFunction的大小。可以看到,Person的大小是12个字节(4个字节name,4个字节age和4个字节的填充字节),而PersonWithVirtualFunction的大小是16个字节(8个字节name和age,8个字节的虚函数指针)。

四、构造函数和析构函数
在C++中,构造函数和析构函数是用于对象的初始化和清理的特殊函数。它们在struct和class中的使用也有一些区别。

在struct中,如果没有显式定义构造函数和析构函数,编译器会自动生成默认的构造函数和析构函数。而在class中,如果没有显式定义构造函数和析构函数,编译器只会生成默认的构造函数,不会生成析构函数。

下面是一个示例:

struct Person {
    std::string name;
    int age;
};

class Car {
    std::string brand;
    int price;
public:
    Car() {
        std::cout << "Constructing Car object." << std::endl;
    }
    ~Car() {
        std::cout << "Destroying Car object." << std::endl;
    }
};

int main() {
    Person person; // OK, 编译器生成默认构造函数
    Car car; // OK, 显式定义了构造函数和析构函数
    return 0;
}

在上面的示例中,我们定义了一个Person结构体和一个Car类。Person没有显式定义构造函数和析构函数,所以编译器会自动生成默认的构造函数和析构函数。而Car显式定义了构造函数和析构函数。

在main()函数中,我们创建了一个Person对象和一个Car对象。由于Person没有显式定义构造函数和析构函数,所以编译器会自动生成默认的构造函数和析构函数。而Car显式定义了构造函数和析构函数,所以我们可以看到构造函数和析构函数的输出。

总结:
在本文中,我们详细探讨了struct和class的区别。结构体和类都可以用来定义一个类,可以包含成员变量和成员函数。它们的主要区别在于默认访问权限、成员函数、继承和访问控制、对象大小以及构造函数和析构函数。在选择使用结构体还是类时,应考虑这些差异以及项目的需求。通常,如果需要更强的数据封装和访问控制,选择使用类可能更合适;而对于简单的数据结构,结构体可能更易于理解和使用。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
C++中,structclass区别主要在于默认的访问权限不同。具体区别如下: 1) struct默认的访问权限是公共的,而class默认的访问权限是私有的。这意味着在struct中定义的成员变量和成员函数默认是公共的,而在class中默认是私有的。\[1\] 2) 在C++中,struct可以定义成员函数,而C语言中的struct不能。这是structC++中的一个功能强大的特点。\[2\] 3) struct可以被继承,而C语言中的struct不能被继承。这意味着在C++中,可以使用struct来实现继承的功能。\[2\] 4) struct还可以实现多态,这也是C语言中的struct所不具备的功能。\[2\] 总的来说,C++中的structclass在用法上有相似之处,但是struct具有更多的功能和灵活性。然而,C++中保留了struct关键字主要是为了保持对C语言的兼容性。\[3\] #### 引用[.reference_title] - *1* [C++ structclass区别](https://blog.csdn.net/weixin_42291376/article/details/120619134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [c++ structclass](https://blog.csdn.net/bitcarmanlee/article/details/124338100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_41920323

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

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

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

打赏作者

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

抵扣说明:

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

余额充值