指针的内容或值是某一变量的内存单元地址,而引用则与初始化它的变量具有相同的内存单元地址。指针是个变量,可以把它再赋值成其它的地址,然而,建立引用时必须进行初始化并且决不会再指向其它不同的变量。
C++没有提供访问引用本身地址的方法,因为它与指针或其它变量的地址不同,它没有任何意义。引用总是作为变量的别名使用,引用的地址也就是变量的地址。引用一旦初始化,就不会与初始化它的变量分开。
6.函数、内联函数以及宏的区别。
程序的模块在C++中通过函数来实现,函数由函数说明和函数体2部分组成。 内联函数是C++语言特有的一种函数附加类别,是通过在函数声明之前插入“inline”关键字实现的。编译器会将编译后的全部内联函数的目的机器代码复制到程序内所有的引用位置并把往返传送的数据也都溶合进引用位置的计算当中,用来避免函数调用机制所带来的开销,提高程序的执行效率。显然这是以增加程序代码空间为代价换来的。
宏定义是编译预处理命令,分为带参数的和不带参数的宏定义。在编译之前进行预处理时,用宏定义中的字符串替换程序中所有出现的宏名。
7. 函数重载有什么好处?
函数重载使函数方便使用,便于记忆,也使程序设计更加灵活,增加程序的可读性。例如,求两个数中最大值的函数max,不管其参数是整数类型、实数类型、字符串,都可以使用同名函数来实现,调用时只需使用max就可以了,编译器将根据实参的类型判断应该调用哪一个函数。
8. 模板有什么作用?函数模板和模板函数有什么区别?
所谓模板是一种使用无类型参数来产生一系列函数或类的机制,是C++的一个重要特征。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免为每一种数据类型产生一个单独的类或函数。
函数模板提供了传递类型的机制。函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码。该定义只是对函数的描述,表示它每次能单
独处理在类型形式参数表中说明的数据类型。
函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行。当编译系统发现有一个函数调用:
<函数名><实参表>;
时,将根据<实参表>中的类型生成一个重载函数,即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而<形参表>的类型则以<实参表>的实际类型为依据。
第三章
1. 为什么要引入构造函数和析构函数?
对象的初始化是指对象数据成员的初始化,在使用对象前,一定要初始化。由于数据成员一般为私有的(private),所以不能直接赋值。对对象初始化有以下两种方法:
类中提供一个普通成员函数来初始化,但是会造成使用上的不便(使用对象前必须显式调用该函数)和不安全(未调用初始化函数就使用对象)。
当定义对象时,编译程序自动调用构造函数。
析构函数的功能是当对象被撤消时,释放该对象占用的内存空间。析构函数的作用与构造函数正好相反,一般情况下,析构函数执行构造函数的逆操作。在对象消亡时,系统将自动调用析构函数,执行一些在对象撤消前必须执行的清理任务。
2. 类的公有、私有和保护成员之间的区别是什么?
① 私有成员private: 私有成员是在类中被隐藏的部分,它往往是用来描述该类对象属性的一些数据成员,私有成员只能由本类的成员函数或某些特殊说明的函数(如第4章讲到的友员函数)访问,而类的外部根本就无法访问,实现了访问权限的有效控制,使数据得到有效的保护,有利于数据的隐藏,使内部数据不能被任意的访问和修改,也不会对该类以外的其余部分造成影响,使模块之间的相互作用被降低到最小。private成员若处于类声明中的第一部分,可省略关键字private。
② 公有成员public:公有成员对外是完全开放的,公有成员一般是成员函
数,它提供了外部程序与类的接口功能,用户通过公有成员访问该类对象中的数据。
③ 保护成员protected: 只能由该类的成员函数,友元,公有派生类成员函数访问的成员。保护成员与私有成员在一般情况下含义相同,它们的区别体现在类的继承中对产生的新类的影响不同,具体内容将在第5章中介绍。缺省访问控制(未指定private、protected、public访问权限)时,系统认为是私有private成员。
3. 什么是拷贝构造函数,它何时被调用?
拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同类对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象时系统自动调用它;其形参是本类对象的引用,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。
在以下四种情况下系统会自动调用拷贝构造函数: ① 用类的一个对象去初始化另一个对象 cat cat1;
cat cat2(cat1); // 创建 cat2时系统自动调用拷贝构造函数,
// 用cat1初始化cat2。
② 用类的一个对象去初始化另一个对象时的另外一种形式 Cat cat2=cat1; // 注意并非cat cat1,cat2; cat2=cat1; ③ 对象作为函数参数传递时,调用拷贝构造函数。 f(cat a){ } // 定义f函数,形参为cat类对象
cat b; // 定义对象b
f(b); // 进行f函数调用时,系统自动调用拷贝构造函数
④ 如果函数的返回值是类的对象,函数调用返回时,调用拷贝构造函数。
4. 设计一个计数器类,当建立该类的对象时其初始状态为0,考虑为计数器定义哪些成员?
// counter.h
#ifndef counter_h #define counter_h
class counter{ private:
int count; public:
counter();
void setCount(int i); int getCount();
void displayCount(); void incrementCount(); void decrementCount(); ~counter(){} };
#endif
// counter.cpp
#include \#include
counter::counter(){ count = 0; }
void counter::displayCount(){ cout << count << endl; }
int counter::getCount(){ return count; }
void counter::setCount(int i){ count = i; }
void counter::incrementCount(){ count++; }
void counter::decrementCount(){ count--; }
// MAIN.CPP
#include \#include
void main(){ counter c1;
c1.displayCount(); c1.setCount(4); c1.displayCount();
for(int i=0; i<=10;i++){ c1.incrementCount(); c1.displayCount(); } }
5. 定义一个时间类,能提供和设置由时、分、秒组成的时间,并编写出应用程序,定义时间对象,设置时间,输出该对象提供的时间。
#include
class Time{
int hour,minute,second; public:
Time(int h=0,int m=0, int s=0){ hour = h; minute = m; second = s; }
void setHour(int h){ hour = h; }
void setMinute(int m){ minute = m; }