您的位置:首页 > 编程语言 > C语言/C++

结构struct(复习笔记)

2008-10-14 23:51 260 查看


在我学习编程的时候.有关于OOP的东西几乎是不了解.也在这时候学到了结构.结构看起来简单.可以并不是那么容易.后来才知道学好了结构对于理解OOP有很大的帮助.因为结构可以说是OOP的基石.因此我特地复习了一下这个.

结构是用户定义的类型[/b].结构是声明了这种类型的属性.那么用户就可以用来创建自己的数据类型.
一.如何创建[/b]
创建结构只要两步:
1. 定义结构.
2. 创建结构对象.
怎么样?像不像类的声明和创建类的对象?
定义结构的框架;
struct 标签
{
结构成员;
};//这里要注意了.和类一样.这里要有分号的.
创建结构的对象
标签 标签2;

在C语言中struct此关键字可以省略.由于C++的意思是”a better than C”.C++也支持C语言中的缺省struct.
要访问结构中的成员.可以使用成员操作符(.)[/b]
标签2.结构成员;//这个就是访问了.

二.结构在声明位置.[/b]
这个是很重要的.按位置的声明可以分为:外部声明.和内部声明.它们的区别在于它们的作用域不同.在外部声明的结构在这个文件中所有的函数都可以使用.而内部声明,仅限于某个函数使用.
结构的成员也可以分为外部声明和内部声明.区别也是作用域不同.

三.结构还有三个要注意的地方:[/b]
1. 结构可以给结构赋值.
2. 结构可以作为参数传给函数.
3. 函数可以返回一个结构.
具体说说:
结构给结构赋值.[/b]
这里顺带说一下结构的初始化.
标签2={a,b,c};或
标签2=
{
a,
b,
c
};

定义结构和创建对象同时进行[/b].
标准的写法:
struct Example_A
{
….//
}Test_A;
在main()中初始化Test_A={…};
另类的:
struct Example_A
{
…//
}Test_A =
{

};
这是结构与类的一个区别.[/b]对于类.不可以这样子赋值的.而结构则可以使用{}对成员变量进行赋值.[/b]
《thinking C++ 2nd edition》中作者对此就有进行了强调。[/b]
所谓的结构给结构赋值.挺简单的.但有前提:它们的类型要相同的[/b].
struct Example_B
{
int a;
int b;
};
main()
{
Example_B Test_B={1,2};
Example_B Test_C;
Test_C=Test_B;// 就是这样子.怎么样.简单吧.
}
传递结构与返回结构[/b]
一起记比较好..也比较好说.
与数组名一样要的是第一个元素.但是.要非常的注意.函数是不能返回数组的.这是限制.但我们可以变一下:可以将数组当作结构或对象的部份进行返回.这里就不多说了.
返回一个结构.需要知道它的第一个地址.结构名只是一个名称.这点与数组不一样.要得到结构的地址[/b].需要使用地址操作符(&)[/b].
函数的参数传递可以是:按值和引用两种方式.结构传递时也是一样的.但有注意点.如果你按值传递结构.而此时结构定义的非常大.那么无疑给传递带来很多的不好.
按值传递:[/b]Example_A_Function(Example_B Test_D);//这样子就是把结构传进来了.
返回时:
Example_B_Function(Example_B Test_D)
{
Example_B Test_E;
….
return Test_E;
}
还有一种情况要特别的看看.就是某函数接受一个结构的形参.返回另一个结构.

比如.我们要让这个函数接受Example_A的形参.返回Example_B.
Example_B Example_C_Function(Example_A Test D)
{
Example_B Test_E;

return Test_E;
}
这些都是按值进行传递的.注意点:此时当结构比较小的时候才用做法.因这种传递是传递整个结构[/b].
结构比较大的时候.那么你试试传递地址吧.
这种做法是传递地址[/b].在时间和空间上明显与按值有很大差别.
例:
Type Example_D_Function(const Example_A * Test_D)
{
….
}
试问一下.为什么要加上const? 如果你不知道.你要去看看按值传递和引用传递补的原理了.

结构与数组[/b]
结构中包含数组看起来很难.其实很简单.它的方法和创建基本类型的数组是一样的[/b].
比如:Example_A Array[10];//与平常声明数组时: int Array[10];是不是一样的?只不过Type不一样罢了.
但是访问这样子的数组时候要小心!
比如:member是Example_A中的一个成员.
cout<<Array[1].member<<endl;//正确.
cout<<Array.member<<endl;//[/b]错误[/b]
如何初始化结构数组呢?
像这样子:
Example_A Array_IN[1]=
{
{…},
{…}
};
以上的内容都是基础的.像:位字段.联合.枚举等等都会在结构中用到.而且哪天你编写COM\OLE DB\Winsock时候你就会用到了这个struct关键字了!
在<Programming Visual C++>一文中就有:
[]
The CSockAddr Helper Class
Many Winsock functions take socket address parameters. As you might remember, a socket address consists of a 32-bit IP address plus a 16-bit port number. The actual Winsock type is a 16-byte sockaddr_in structure, which looks like this:
struct sockaddr_in {
short   sin_family;
u_short sin_port;
struct  in_addr sin_addr;
char    sin_zero[8];
};
//这是在winsock一章就有讲到.

是不是要用到结构来定义?
看似简单的结构却不简单[/b].它可以与很多关键字联合使用.我们用一道微软的面试题目来看看你到底了解多少了.
#include <iostream>
using namespace std;
[align=left]#pragma pack(8)[/align]
[align=left]struct example1[/align]
[align=left]{[/align]
[align=left]short a;[/align]
[align=left]long b;[/align]
[align=left]};[/align]
[align=left]struct example2[/align]
[align=left]{[/align]
[align=left]char c;[/align]
[align=left]example1 struct1;[/align]
[align=left]short e;[/align]
[align=left]};[/align]
[align=left]#pragma pack()[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]example2 struct2;[/align]
[align=left]cout << sizeof(example1) << endl;[/align]
[align=left]cout << sizeof(example2) << endl;[/align]
[align=left]cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;[/align]
[align=left]return 0;[/align]
}
呵呵.输出的答案是多少呢?
[align=left]C[/b]语言与C++语言struct的一些区别:[/b][/align]
[align=left]C语言中当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将2 个实例中的[/align]
指针型成员指向了同一片内存。
[align=left]在C++语言中,当结构体中存在指针型成员时,我们需要重写struct 的拷贝构造函数并进行“=”[/align]
操作符重载.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息