大多数C库中都有一组struct和一组作用在这些struct上的函数。
在使用库时,必须向这个库中的每一个函数传递这个结构的地址。C中最大的障碍之一是名字冲突。我们知道struct内部的标识符不会与全局标识符冲突。
基本对象
-
C++的第一步正是这样,函数可以放在struct内部。
当正在定义这个函数时,需要完全指定它是哪一个,为了完成这个指定任务,c++有一个新的运算符(::),即作用域解析符。 来自这个库的C版本的第一个参数不在是显式,但是如果希望获得该结构的地址,使用this。 在c++中对象就是变量,对象必须有唯一的标识,在c++中使唯一的地址。 它是一块空间,在这里可以存放数据,而且还隐含着对这些数据进行处理的操作。嵌套结构 struct Stack { struct Link { Void* data; Link* next; Void initialize(void* dat, Link* nxt); }* head; Void init(); Void push(void * dat); Void* peek(); Void* pop(); Void cleanup(); }; -
C++的访问控制
用于在结构中设置边界:public,private,protected, 必须加:。 public在其后声明的所有成员可以被所有人访问, struct默认之。 private:除了该类型的创建者和类的内部成员函数外,任何人不能访问。 protected与private基本相似,继承的结构可以访问protected成员。 友元 一个friend必须在一个结构内声明。 Global friend Struct member friend Entire struct is a friend 嵌套友元: 嵌套的结构不能自动获得访问private成员的权限。 如何获得: 声明一个嵌套结构, 然后声明它是全局范围使用的一个friend,最后定义这个结构。 结构的定义必须与friend声明分开,否则编译器将不把它看做成员。 句柄类 C++访问控制允许将实现部分与接口部分分开,但实现部分的隐藏是不完全的。 1)隐藏实现:把编译好的实际结构放在实现文件而不是让其暴露在头文件中。 2)减少重复编译。
//all user can see this head file.
Handle.h
class Handle
{
struct Cat; //class declaration only
Cat* smile;
Public:
Void init();
Void cleanup();
Int read();
Void change(int);
}
// define Handle's implementation, it's not visible to user
// 在提供一个结构的主体部分之前不能创建一个对象
Handle.cpp
#include "Handle.h"
Struct Handle::Cat
{
Int i;
};
Void Handle::init()
{
Smile=new Cat;
Smile->i=0;
}
-
ctr + dtr
ctr确保初始化编译器在对象定义时完成ctr, name same as class name. 传递给ctr的first 参数是this,对于ctr来说,this指向一个没有初始化的内存块, ctr的作用就是正确的初始化该内存块。dtr确保清除
当对象超出作用域时,编译器自动调用dtr。即使使用goto语句跳出这一程序块。 ~class_name() // no argument { }nonlocal goto (used C func setjmp() and longjmp()):
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/non-local-goto/goto.html聚合初始化
大括号括起来 Int a[3] ={1,2,3}; 如果struct 有私有成员,或者所有成员是public,但有ctr, 此时必须调用ctr来完成初始化。
本文介绍了C++中结构体(struct)的概念及其与C语言的区别,包括如何在结构体中定义函数、作用域解析符的使用、访问控制(public、private、protected)及友元的声明方式。此外还详细阐述了句柄类的概念以及构造函数(ctor)和析构函数(dtor)的作用。
2589

被折叠的 条评论
为什么被折叠?



