C 和C++间struct 的深层区别

 
C C++ struct 的深层区别
       C++ 语言中 struct 具有了 的功能,其与关键字 class 的区别在于 struct 中成员变量和函数的默认访问权限为 public ,而 class 的为 private
       例如,定义 struct 类和 class 类:
struct structA
{
      char a;
      …
}
class classB
{
      char a;
      …
}
则:
       structA a;
       a.a = 'a';       // 访问 public 成员,合法
       classB b;
       b.a = 'a';       // 访问 private 成员,不合法
       许多文献写到这里就认为已经给出了 C++ struct class 的全部区别,实则不然,另外一点需要注意的是: C++ 中的 struct 保持了对 C struct 的全面兼容(这符合 C++ 的初衷 ——“a better c” ),因而,下面的操作是合法的:
// 定义 struct
struct structA
{
      char a;
      char b;
      int c;
};
       structA a = {'a' , 'a' ,1};     // 定义时直接赋初值
       struct 可以在定义的时候直接以 { } 对其成员变量赋初值,而 class 则不能,在经典书目《 thinking C++ 2nd edition 》中作者对此点进行了强调。
 
struct 编程注意事项
看看下面的程序:
1. #include <iostream.h>
2. struct structA
3. {
4.          int iMember;
5.          char *cMember;
6. };
7. int main(int argc, char* argv[])
8.{
9.           structA instant1,instant2;
10.         char c = 'a';
11.        instant1.iMember = 1;
12.         instant1.cMember = &c;
13.        instant2 = instant1;
14.        cout << *(instant1.cMember) << endl;
15.         *(instant2.cMember) = 'b';
16.        cout << *(instant1.cMember) << endl;
17.         return 0;
18. }
14 行的输出结果是: a
16 行的输出结果是: b
       Why? 我们在 15 行对 instant2 的修改改变了 instant1 中成员的值!原因在于 13 行的 instant2 = instant1 赋值语句采用的是变量逐个拷贝,这样 instant1 cMember 指针变量的值拷贝给 instant1 cMember ,这使得 instant1 instant2 中的 cMember (一样)指向了同一片内存,因而对 instant2 的修改也是对 instant1 的修改。
       C 语言中,当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将 2 个实例中的指针型成员指向了同一片内存。
       C++ 语言中,当结构体中存在指针型成员时,我们需要重写 struct 的拷贝构造函数并进行 “=” 操作符重载。
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值