老钟古

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

记录下自己的学习笔记和一些相应的常见问题,有错误的地方欢迎指正。

 

问题1、在类内部定义和类外部定义的成员函数有什么区别?

答:在类内部定义的成员函数默认是为inline(内联)函数,而在外部定义的成员函数需要加上类的作用域和默认其不是inline函数。

 

问题2、怎么定义成员函数为const成员函数?

答:const成员不能改变其所操作的对象的数据成员,当声明在类的内部和定义在类的外部时,const必须同时出现在声明和定义中。

 

问题3、类的背后蕴涵里什么思想?

答:类背后蕴涵的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程和设计技术;封装是一项将低层次的元素组合起来形成新的、高层次实体的技术。数据抽象使得使用该类的程序员不必了解其细节,使用其接口就可以了。而类的设计者则需要考虑类的实现细节。比如标准库的使用。

 

 

问题4、类通过什么方式来实现抽象和封装?

答:类是通过访问标号来实现这种技术的,一般来说类有三种访问标号private、public、protected,private封装了类型的实现细节,程序的所有部分都可以访问带有public标号的成员,protected一般是在有基类和继承类中才会使用。类如果是用struct关键字定义的,则默认的访问标号是public的,类是用class关键字定义的,则默认的访问标号是private的。访问标号的出现次数并没有限制和其出现的位置也没有,一种访问标号的作用域随着另外一种访问标号的出现或者到类的定义结束之处。

 

问题5、数据抽象和封装带来了什么好处?

答(1)避免类内部出现无意的、可能破坏对象状态的用户级错误;

(2)随时间推移可以根据需求改变或缺陷报告来完善类实现,而无须改变用户级代码,这个对于维护都是很有帮助的。

 

问题6、成员函数是否可以被重载?

答:成员函数是可以被重载的,但只能重载本类的其他成员函数,重载的成员函数和普通函数应用相同的规则:两个重载成员的形参数量和类型不能够完全相同。

 

问题7、当要编写相互依赖的类时,应该怎么做?

答:这时候可以用前向声明一个类,此时的类为一个不完全类型,使用是要注意不完全类型只能用于定义指向该类型的指针及引用,或者用于声明使用该类型作为形参类型或返回类型的函数,主要原因是因为不完全类型并没有定义,不知道其所占的空间是多大,指针和引用一般都是4个字节(32位机器)。

 

问题8、非const成员函数和const成员函数返回的*this有什么区别?

答:在普通的非const成员函数中,this类型是一个指向类类型的const指针,可以改变this所指向的值,但不能改变this所保存的地址,在const成员函数中,this的类型是一个指向const类型对象的const指针。此时既不能够改变this所指向的对象,也不能够改变this所保存的地址。

 

问题9、类的作用域一般会包括哪些部分呢?

答:每个类都定义了自己的新作用域和唯一类型。在类作用域之外,成员只能够通过对象或指针分别使用成员访问符.或->来访问。在类外部定义的成员函数中,形参表和成员函数体都出现在成员名之后,所以成员函数的形参表和函数体处于类作用域中。又由于函数返回类型是在类作用域之前的,所以函数返回类型不一定在类作用域中,必须使用完全限定名来实现返回类型是在类的作用域中(classname::memfcn)。

 

问题10、构造函数有什么特点及如何使用?

答:构造函数的工作是保证每个对象的数据成员具有合适的初始值,构造函数的名字与类的名字相同,并且不能指定返回类型。构造函数可以有多个,但没有虚构造函数。构造函数不能声明为const。构造函数初始化式只在构造函数的定义中而不是在声明中指定。建议使用构造函数初始化列表来对对象进行初始化操作,这样做能够保证效率。需要记住赋值与初始化的区别。

 

问题11、什么情况下必须使用构造函数初始化列表?

答:当有引用和const类型数据成员时,因为对于它们都是不能够进行赋值操作的,当然在IO的操作也是如此,对于标准库iostream中所使用的技术也是相同的。一句话,必须对任何 const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化列表。

 

问题12、成员初始化的次序是怎么样的?

答:成员初始化的次序最好是定义成员的次序,一般来说初始化的次序常常无关紧要,但如果一个成员是根据其他成员而初始化,此时成员初始化的次序是至关重要的。但这样做法是不好的,正确的是按照与成员声明一致的次序编写构造函数初始化列表,尽可能避免使用成员初始化其他成员。

 

问题13、当两个构造函数初始化列表很相似时该怎么做?

答:为了避免代码的重复,可以采用默认实参来进行构造函数初始化列表来将两个相似的构造函数合并为一个。但要注意使用默认实参时必须遵循其使用规则。默认实参是放在形参列表的最后面的,默认实参后面不能够跟随一个非默认实参的参数。

 

问题14、当不想使用构造函数定义的隐式转换该如何做?

答:可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数。explicit关键字只能用于类内部的构造函数声明上,在类的定义体外部所做的定义上不能再重复它。任何构造函数都可以用来显式地创建临时对象。

 

问题15、什么情况下可以使用类成员的显式初始化?

答:对于没有定义构造函数并且其全体数据成员均为public的类,可以采用与初始化数组元素相同的方式初始化其成员。

显式初始化类类型对象的成员有三个重大缺点:

(1) 要求类的全体数据成员都是public。

(2) 将初始化每个对象的每个成员的负担放在程序员身上。

(3) 如果增加或删除一个成员,必须找到所有的初始化并正确更新。

所以建议定义和使用构造函数总是比较好的。

 

问题16、该如何做使某些操作访问类的私有成员但同时阻止其它操作的访问?

答:可以利用友元机制,友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元声明以关键字friend开始,它只能出现在类定义的内部,但不限于在类定义体内部出现的位置。好的建议是将友元声明成组地放在类定义的开始或结尾。

 

问题17、类的static成员和static成员函数有什么作用?

答:当需要访问一个全局对象时,为了避免破坏类的封装性,可以使用static成员。Static数据成员独立于该类的任意对象而存在;每个static数据成员是与类关联的对象,并不与该类的对象相关联。static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。


posted on 2011-03-27 11:26  老钟古  阅读(406)  评论(0编辑  收藏  举报