1.2 关键词带来的差异,class 与 struct

本文探讨了C语言中的struct与C++中的class的区别,包括访问级别、数据抽象及空间布局等方面。同时介绍了如何在C++中实现与C兼容的空间布局,并讨论了C++中的内存布局规律以及C中的一种特殊技巧及其在C++中的应用。

Q1:strcut 关键词与 class 关键词的区别

①. 除了访问级别外并无不同

②.  在观念上,struct 关键词是 C 的数据抽象概念,class 关键词是C++ 的 ADT(抽象数据类型)观念

Q2:策略性正确的struct

 ①. 当单纯定义仅含数据成员的结构体时,使用 struct 将数据封装起来,保证拥有与 C 兼容的空间布局

 ②. 当定义含操作的类时,使用 class 较好

    注:当需要 C 声明那样的数据时,应将所需部分用 struct 声明,并通过转换操作符从 class 中萃取出来

Eg:
Struct C_point{…};
        Class Point
        {
            Public:
                Operator C_point() {return _c_point;}  //转换操作符的使用

            Private:
                C_point _c_point;
        }   
    此时 C_point 有与 C 完全兼容的空间布局

Q3:C++ class 内存布局

①.处于同一个 access section 的数据,必定保证以其声明顺序出现在内存布局中。

②.处于不同的 access section 中的数据之间的排列顺序则不一定。

Q4:一个 C 中的使用技巧:把单一元素数组放在一个 struct 的尾端,则每个 struct 对象都可以用一个可变大小的数组

Eg:
        Struct mumble
        {
            Char pc[1];
        };

        //读取一个字符串,为struct 本身与该字符串配置足够的内存

        Struct mumble * pmumbl = (struct mumble *)  malloc (sizeof( struct mumble) + strlen(string) + 1 );

        Strcpy(pmumble->pc,string);
但是在C++ 中,这种技巧有可能顺利实现,有可能不能实现

Eg:
        Class stumble
        {
            Public:
              //….
            Protected :
            //….
            Private:
                       char  pc[1];
        };
    此时,若 protected data member 位于 private data member 之前时,可以实现该技巧;否则,将无法实现。
### C++ 类对象详解 #### 封装的意义 封装是指通过访问控制机制隐藏数据的具体实现细节,仅暴露必要的接口供外部使用。这种设计使得类内部的数据更加安全,同时也便于维护和扩展[^5]。 #### `struct` 和 `class` 的对比 在 C++ 中,`struct` 和 `class` 都可以用来定义新的复合类型,但它们之间存在一些细微的区别。主要体现在默认的访问权限上: - 对于 `struct`,其成员默认为公有 (`public`); - 而对于 `class`,其成员默认为私有 (`private`)。 尽管如此,在功能上两者并无本质差异,因此现代 C++ 更倾向于使用 `class` 来表示具有复杂行为的对象[^1]。 #### 私有成员 私有成员是只有该类本身及其友元才能访问的部分,通常用于保护敏感数据或方法不受外界干扰。通过设置某些字段为私有属性,开发者能够更好地管理程序逻辑并减少潜在错误的发生概率[^3]。 #### 构造函数 构造函数是一种特殊类型的成员函数,它主要用于初始化新创建出来的对象实例。以下是关于它的几个重要特点: - 名字必须跟所属类别完全一致; - 不具备任何返回值类型(包括 void); - 当声明某个特定形式的新实体时会被自动触发执行一次; - 支持重载以便适应不同场景下的需求[^2]。 #### 析构函数 析构函数则是在销毁一个已经存在的对象之前由系统调用的一个过程,负责清理资源等工作。值得注意的是,每一个非数组型别的单一维度动态分配内存都需要配对相应的释放动作以防泄露问题出现[^4]。 #### 拷贝构造函数深浅拷贝区别 当复制现有对象到另一个同种类型的变量之中时,默认情况下会采用位级赋值方式完成这项任务——即所谓的“浅拷贝”。然而如果源目标含有指向堆区存储位置的信息,则可能引发双重删除的风险或其他异常状况。为了避免这些问题发生,我们需要自定义版本的拷贝构造函数来进行所谓“深层”的克隆操作。 ```cpp // 浅拷贝示例 class MyClass { public: int* ptr; MyClass(int value) : ptr(new int(value)) {} }; // 深拷贝示例 class DeepCopyClass { public: int* data; DeepCopyClass(const DeepCopyClass& other) { this->data = new int(*other.data); // 创建独立副本 } }; ``` #### 初始化列表 为了提高效率或者处理那些无法经由常规途径设定初始状态的情况(比如常量成员),我们可以利用初始化列表来预先指定各个组成部分应有的起始数值。 ```cpp class Example { private: const double pi; public: Example() : pi(3.14159265358979323846){} // 使用初始化列表给const成员赋初值 }; ``` #### 类对象作为成员 有时候我们会遇到这样的情况:某一大型系统的组件是由若干个小规模单元组合而成的整体结构。此时就可以考虑让这些子模块成为母容器的一部分,从而形成嵌套关系。 #### 静态成员 静态成员属于整个类别而非单个个体所有者共享同一份实际储存空间。这意味着无论有多少个具体体现被制造出来,都只会保留唯一的一组共同使用的资料副本。 #### this指针的作用 `this` 是一种隐含传递至每个非静态成员函数内的参数,代表当前正在被执行的操作所关联的那个确切实例。借助它可以区分局部命名冲突或是明确指出应该作用在哪一部分之上。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值