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
的拷贝构造函数并进行
“=”
操作符重载。