• C++ struct和class的区别


    在 C++ 中class 和 struct  只有两点主要区别:

    • 默认继承权限。默认情况下,class的继承是以private来继承而struct则是按照public进行继承。
    • 成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。

    而其它的特性,struct和class基本上,甚至严格来说是一样的:

    01//一个不常见的示例,将 struct 直接改为class也能编译通过。
    02//编译环境为 GCC 4.4.1
    03#include <iostream>
    04#include <string>
    05using namespace std;
    06 
    07struct bar
    08{
    09    private: // 访问权限修饰符
    10        int y;
    11    public:
    12        bar(){}; //无参构造函数
    13        bar(int a){ y = a;}//带参数的构造函数
    14        ~bar(); //虚构函数
    15        void say();
    16        virtual void func1() = 0; //纯虚函数
    17};
    18 
    19struct  foo: protected bar // 继承
    20{
    21    private:
    22          int x;
    23    public:
    24         foo(){};
    25         void say(string msg) {cout<<msg<<endl;}
    26         virtual int func2();//虚函数
    27 
    28};
    29 
    30int main() {
    31    return 0;
    32}

    可以看到:

    • 都可以有成员函数:struct可以包含和class中一样的构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
    • 尽管默认访问权限不同,但都可以拥有public/private/protected修饰符;
    • 都可以进行复杂的继承和多重继承,一个struct可以继承自一个或多个class,反之亦可。
    • 注意这里与C语言并不相同,C 语言中的 struct 从本质上来说只是一个包装数据的语法机制。


    Google C++编程风格指南 中也声称:

    仅当叧有数据时使用 struct,其它一概使用 class。

    在 C++中,关键字struct和 class 几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。

    struct 被用在仅包含消极对象( passive objects)上,可能包括有关联的常量,但没有存取数据成员外的函数功能,而存取功能通过直接访问实现而无需方法调用,这儿提到的方法是指只用于数据 成员的,如构造函数、析构函数、Initialize()、Reset()、Validate()。

    如果需要更多的函数功能,class 更适合,如果不确定的话,直接使用 class。

    如果不 STL结合,对于仿函数(functors)和特性(traits)可以不用 class 而是使用struct。

    虽然一些C++专家声称可以不再使用struct关键字,而可以总是使用class { public:}来代替。但事实上,struct仍在代码中广泛使用,开发人员常使用struct(部分也是由于C语言的影响)来表示一个轻量级的并不需 要严格封装的记录,例如,一个写入文件的记录或数据库表结构就常用struct来声明;而class则主要是用来进行面向对象编程。

    在一般情况下,仍必须使用struct结构的主要原因是:

    • 开发维护遗留系统。
    • 需要与传统的API进行通讯。

    当然,有时使用struct可以让代码看起来更简洁:

    1struct Compare { bool operator() { ... } };
    2std::sort(collection.begin(), collection.end(), Compare());

    C++ 中的高级特性和语法细节太多,因此遵循一定的编程规范还是很有必要的。

  • 相关阅读:
    iOS开发者程序许可协议
    IOS升级之 Objective-c新特性
    ios 性能优化之自动化UI测试
    ios 性能优化之CPU性能调优
    ios 性能优化之图形性能测试
    ios 性能优化之测试 iOS设备I/O活动
    ios 性能优化之定位应用程序的内存问题
    ios 性能优化之app运行时数据收集
    IOS8 理解应用程序扩展是如何工作的
    IOS8 创建一个应用程序扩展
  • 原文地址:https://www.cnblogs.com/super119/p/2307121.html
Copyright © 2020-2023  润新知