📄 subject_26273.htm
字号:
<p>
序号:26273 发表者:tigersky2000 发表日期:2002-12-30 17:26:07
<br>主题:向“雷神”学习,C++编程思想读书笔记(二)
<br>内容:C++编程思想学习笔记(二)<BR><BR>第三章 隐藏实现<BR>关于 public(公有) private(私有) protected(保护)<BR>public:声明其定义块中的成员变量与成员函数是公有的。即无论是结构内部还是结构外部都可以访问它。<BR>Private:在它的块中定义的成员变量和成员函数是这个类私有的,只有该结构的成员函数可以访问,结构外部的函数是不能够访问它们的,这就相当于它们被隐藏在结构的内部了。<BR>Protected:它和private类似,不同的是protected内定义的成员变量和函数可以被他的继承结构来访问。<BR><BR>友元函数指的是那些不是结构内部的但又可以议问结构私有成员的外部函数。如果要使一个函数成为某个结构的友元函数的话,那需要在结构的内部将这个函数声明成它的友元函数。声明是由friend关键字来修饰的。<BR>关于友元值得注意的一点是:结构内定义的结构(嵌套结构)并不能自动的成为母结构的友元,也就是说,嵌套结构中的成员函数在没有明确声明为母结构的友元的情况下,是不能够访问母结构中的私有成员的。<BR><BR>类与结构的区别<BR>类(class)是C++中新引进的,他与C++中结构的区别在于:类中的成员缺省是私有的,而结构中的成员缺省是公有的。<BR><BR>句柄类<BR>句柄类把类里么有成员定义到一个私有的子结构中,然后在实现文件中定义这个子结构。<BR>句柄类应该说是一个编程的小技巧,它有一定的好处:1、它使得类的使用者在类的头文件中看不到类的具体情况,因类具体的东西在子结构中,而这个子结构在实现文件中,并且已经被编译成了目标文件了。2、减少重复编译,如果对这个类进行修改,修改的只有实现文件,那重新编译时只需要单独编译这个实现文件就可以了。具体的例子可以参见书P52页的例子。<BR><BR><BR>第四章 初始化与清除<BR><BR>构造函数与析构函数<BR>构造函数与析构函数分别是在类创建和销毁时调用的函数。构造函数主要完成该类的初始化,析构函数主要完成对象释放等工作。<BR>为了让编译器知道什么函数是构造与析构函数,所以,在C++中,构造函数的函数名就是该类的名字,其析构函数的函数名是在该类的名字前加上~号。<BR>构造函数与析构函数是没有返回值的。这是因为这两种特殊的函数是由系统自动调用的,用户无法显示的调用他们,从而也就无法获得返回值,所以在这两类函数中返回值是没有意义的。<BR>构造函数可以被重载,通过重载构造函数,可以让用户以多种不同的方式初始化新生成的类的实例。而析构函数只是一个不带参数和返回值的唯一的函数(不可被重载)。<BR><BR>集合初始化<BR>在定义一个数组时,我们可以直接给出数组的初值,例如: int a[5]={1,2,3,4,5}; 需注意的是,如果给出的值的个数大于数组的大小时,会产生编译错误,如果给出的值的个数小于数的大小时,其后部分会被编译器用0填充。<BR>我们也可以在不给定数组大小的情况下定义并初始化数组,这时,编译器自动计算数组的大小,例如:int a[]={1,2,3,4,5}; 这样,数组大小自动被定义为5,我们可以通过表达式 sizeof(a)/sizeof(*a)(就是数组的大小除以首个元素的大小)来获得数组的大小。<BR>对于带构造函数的类的数组的初始化,则必须指示出其构造函数的调用,如 Y y[]={y(1),y(2)};<BR><BR>缺省构造函数<BR>就是不带任何参数的构造函数。当没有指定任何构造函数时,编译器自动生成一个缺省构造函数,但是,当类中定义了带参数的构造函数后,就必须明确的创建一个缺省构造函数。<BR><BR>第五章 函数重载与缺省参数<BR><BR>函数重载<BR>对于相同的函数名,因为它带的参数类型与个数的不同,可以被分解成不同的函数调用。当我们用不同的参数类型去调用函数时,编译器会根据参数信息,找到应该被调用的函数。<BR>函数可以根据参数的不同进行重载,但是却不能够通过返回值的不同进行重载,设想,假如可以的话,如果我们只调用一个函数,并没有去管他的返回值,如 fun(); 那么,编译器怎么会知道我们想要去调用的是哪一个重载函数呢?<BR><BR>缺省参数<BR>在定义函数时,我们可以指定该函数部分参数的缺省值,这样,当我们想用缺省值调用该函数时,我们就不用给出这个参数了。<BR>缺省参数定义如下: int fun(int a, int b, int c=0, int d=0)<BR>注意:在定义缺省参数时,如果开始定义一个缺省参数了,那么它后面的所有参数都必须为缺省参数。<BR><BR>一个问题,看如下程序:<BR>include <iostream.h><BR><BR>void fun()<BR>{<BR>cout<<”default”<<endl;<BR>}<BR><BR>void fun(int I=0)<BR>{<BR>cout<<I<<endl;<BR>}<BR><BR>man()<BR>{<BR>fun()<BR>}<BR><BR> 这个程序编译时会出现fun不明确的错误,因为表面上看,fun是一个被重载了函数,但是,编译器无法确定main函数中fun()究竟调用的是哪一个,fun()即可以被理解成无参数的调用,也可以被理解成带缺省参数的调用。<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:tigersky2000 回复日期:2002-12-31 10:41:58
<br>内容:请大家帮我看看有没有理解的不对的地方,谢谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:bb 回复日期:2002-12-31 11:20:34
<br>内容:构造函数与析构函数是没有返回值的。这是因为这两种特殊的函数是由系统自动调用的,用户无法显示的调用他们,从而也就无法获得返回值,所以在这两类函数中返回值是没有意义的。<BR>------------------------<BR>构造函数实际上是返回对象的引用,可以显式调用。如:<BR>CRect rect;<BR>rect=CRect(0,0,100,100);<BR>或<BR>void Draw(CRect& rect);<BR>调用时可用:<BR>Draw(CRect(0,0,100,100));<BR><BR><BR>缺省构造函数<BR>就是不带任何参数的构造函数。当没有指定任何构造函数时,编译器自动生成一个缺省构造函数,但是,当类中定义了带参数的构造函数后,就必须明确的创建一个缺省构造函数。<BR>---------------------<BR>当类中定义了带参数的构造函数后,是不必须创建一个缺省构造函数的。<BR>如:<BR>class A<BR>{<BR> A(int a);<BR> ....<BR>};<BR><BR>只是声明对象时要注意:<BR>A obj(1); //正确<BR>A obj1; //编译错误,无缺省构造函数<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tigersky2000 回复日期:2002-12-31 12:20:23
<br>内容:恍然大悟,谢谢! <BR><BR>请大家继续批评!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -