<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 

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

 

结构是用户定义的类型 . 结构是声明了这种类型的属性.那么用户就可以用来创建自己的数据类型.

.如何创建

创建结构只要两步:

1.      定义结构.

2.      创建结构对象.

怎么样?像不像类的声明和创建类的对象?

定义结构的框架;

struct 标签

{

    结构成员;

};// 这里要注意了.和类一样.这里要有分号的.

创建结构的对象

标签 标签2;

 

C语言中struct此关键字可以省略.由于C++的意思是”a better than C”.C++也支持C语言中的缺省struct.

要访问结构中的成员.可以使用成员操作符(.)

标签2.结构成员;//这个就是访问了.

 

.结构在声明位置.

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

结构的成员也可以分为外部声明和内部声明.区别也是作用域不同.

 

.结构还有三个要注意的地方:

1.      结构可以给结构赋值.

2.      结构可以作为参数传给函数.

3.      函数可以返回一个结构.

具体说说:

结构给结构赋值.

这里顺带说一下结构的初始化.

标签2={a,b,c};

标签2=

{

a,

b,

c

};

 

定义结构和创建对象同时进行 .

标准的写法:

struct Example_A

{

  ….//

}Test_A;

main()中初始化Test_A={…};

另类的:

struct Example_A

{

   …//

}Test_A =

{

   …

};

这是结构与类的一个区别.对于类.不可以这样子赋值的.结构则可以使用{}对成员变量进行赋值.

thinking C++ 2nd edition》中作者对此就有进行了强调

所谓的结构给结构赋值.挺简单的.但有前提:它们的类型要相同的.

struct Example_B

{

  int a;

  int b;

};

main()

{

      Example_B Test_B={1,2};

      Example_B Test_C;

      Test_C=Test_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;

}

这些都是按值进行传递的.注意点:此时当结构比较小的时候才用做法.这种传递是传递整个结构.

结构比较大的时候.那么你试试传递地址吧.

这种做法是传递地址.在时间和空间上明显与按值有很大差别.

:

Type Example_D_Function(const Example_A * Test_D)

{

       ….

}

试问一下.为什么要加上const? 如果你不知道.你要去看看按值传递和引用传递补的原理了.

 

结构与数组

结构中包含数组看起来很难.其实很简单.它的方法和创建基本类型的数组是一样的.

比如:Example_A Array[10];//与平常声明数组时: int Array[10];是不是一样的?只不过Type不一样罢了.

但是访问这样子的数组时候要小心!

比如:memberExample_A中的一个成员.

cout<<Array[1].member<<endl;// 正确.

cout<<Array.member<<endl;// 错误

如何初始化结构数组呢?

像这样子:

 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:

 
  

 
  

是不是要用到结构来定义?

看似简单的结构却不简单 . 它可以与很多关键字联合使用.我们用一道微软的面试题目来看看你到底了解多少了.

#include <iostream>

using namespace std;

#pragma pack(8)

struct example1

{

short a;

long b;

};

struct example2

{

char c;

example1 struct1;

short e;

};

#pragma pack()

int main(int argc, char* argv[])

{

example2 struct2;

cout << sizeof(example1) << endl;

cout << sizeof(example2) << endl;

cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;

return 0;

}

呵呵.输出的答案是多少呢?

C 语言与C++语言struct的一些区别:

C 语言中当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将2 个实例中的

指针型成员指向了同一片内存。

C++语言中,当结构体中存在指针型成员时,我们需要重写struct 的拷贝构造函数并进行“=

操作符重载.