C++编程思想-数据抽象+隐藏实现+初始化与清除

本文介绍了C++中结构体(struct)的概念及其与C语言的区别,包括如何在结构体中定义函数、作用域解析符的使用、访问控制(public、private、protected)及友元的声明方式。此外还详细阐述了句柄类的概念以及构造函数(ctor)和析构函数(dtor)的作用。

大多数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来完成初始化。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值