间,
构造函数是一种特殊的成员函数,它主要用于为对象分配空
进行初始化。
return0;
3.1类声明的一般格式是什么
构造函数的名字必须与类名相同,而不能由用户任意命名。
它可以有任意类型的参数,但不能具有返回值类型。
析构函数通常用于执行一些清理任务,如释放分配给对象的内存空间等。
析构函数名与类名相同,但它前面必须加一个波浪号。
不能有返回值,也不能有参数。
3.3什么是对象数组?
所谓对象数组,是指每一个数组元素都是对象的数组。
3.4什么是this指针?
它的主要作用是什么?
C++为成员函数提供了一个名为this的指针,这个指针称为
自引用指针。
每当创建一个对象时,系统就把this指针初始化为指向该对象。
一个类的所有对象合用一份成员函数,this指针可以帮助对
象辨别出当前调用的是自己的那个对象的数据成员和函数。
3.5友元函数有什么作用?
友元函数可以在类的外部访问类的私有成员或保护成员。
(3)化。
声明并定义了
P2,
并调用Point类的拷贝构造函数用P1对P2进行初始
3.6
调用拷贝构造函数,将P1的成员值赋值给P4的成员。
3.7-3.10BCCB3.11-3.15BAABA3.16-3.17BB3.1810,2030,4850,68
70,80
90,16
11,120
3.19
Constructing
10
100
Destructing
3.20
3objectsinexistence
4objectsinexistenceafterallocation
3objectsinexistenceafterdeletion
3.21
Countingat0
Countingat9
3.22
Defaultconstructorcalled.
Defaultconstructorcalled.
Defaultconstructorcalled.
Construcotor:
a=1,b=2
Construcotor:
a=3,b=4
Construcotor:
a=5,b=6
3.23
Con.
3.24
3.25
3.26
3.27
3.28
Copycon.
default.
Copycon.
A=5
B=14
A=9
B=14
5,7
22.25
Constructing
Constructing
A=5
B=15
A=10
B=15
Destructing
Destructing
voidpintStu();
函数只有声明,没有定义。
age是私有成员,不能用对象直接调用。
Student:
:
3.29
voidprintStu()和voidsetSno(ints)
voidsetAge(inta)在类中没有声明
没有加限定符
构造函数不能定义为私有。
否则无法创建对象。
3.30下面是一个计算器类的定义,请完成该类成员函数的实现。
classcounter
{public:
counter(intnumber);voidincrement();voiddecrement();intgetvalue();intprint();
private:
intvalue;
};
counter:
:
counter(intnumber){
value=number;
}
voidcounter:
:
increment()
{
++value;
}
voidcounter:
:
decrement()
{
--value;
}
int
{
counter:
:
getvalue()
returnvalue;
}
int
{
cout<returnvalue;
counter:
:
print()
//
//
//
//
给原始值加1
给原始值减1取的计数器值显示计数
3.31根据注释语句提示,实现类Date的成员函数
#include
usingnamespacestd;classDate
{
printDate();setDay(intd);setMonth(intm);setYear(inty);
public:
void
void
void
void
private:
intday,month,year;
};
voidDate:
:
printDate()
{
cout<<"今天是"<}
voidDate:
:
setDay(intd)
{
day=d;
}
intm)
voidDate:
:
setMonth(
{
month=m;
}
inty)
voidDate:
:
setYear(
{
year=y;
}
intmain()
{
DatetestDay;
5);
10);
2003);
testDay.setDay(
testDay.setMonth(
testDay.setYear(
testDay.printDate();
return0;
}
3.32建立类cylinder,cylinder的构造函数被传递了两个double值,分别表示圆柱体的半径和高度。
用类cylinder计算圆柱体的体积,并存储在一个double变量中。
在类cylinder中包含一个成员函数vol,用来显示每个cylinder对象的体积。
constintPI=3.14;
classcylinder
{private:
doublepublic:
cylinder(
double
radius,height,volume;
intrad,inthei);getVolume();
voidvol();};cylinder:
:
cylinder(intrad,inthei){radius=rad;height=hei;
}doublecylinder:
:
getVolume(){
volume=PI*radius*radius*height;returnvolume;
}
voidcylinder:
:
vol()
{
cout<<"圆柱体的体积是:
"<3.33构建一个类book,其中包含有两个私有数据成员qu和price,将qu初始化为1~5,将
price初始化为qu的10倍,建立一个有5个元素的数组对象。
显示每个对象数组元素的qu*price值。
classbook{private:
int
public:
book(
int};
qu,price;
intqu);mult();
book:
:
book({
intq)
if(q<
1||q>5)
qu=
1;
else
qu=q;
}
price=10*qu;}int{
book:
:
mult()
returnqu*price;
}int{
bookbooks[5]={1,2,3,4,5};for(inti=0;i<5;i++)
main()
cout<IIII.
修改3.33,通过对象指针访问对象数组,的qu*price值。
classbook{private:
qu,price;
intqu);mult();
intpublic:
book(
book:
:
book({
intq)
if(q<
1||q>5)
int};
1;
qu=
else
qu=q;
}
10*qu;
price=
}
intbook:
:
mult()
{
returnqu*price;
intmain()
{
bookbooks[5]={1,2,3,4,5};book*p=books;
p
+=4;
for(inti=0;i<5;i++)
cout<mult()<<--p;
IIII.
return0;
构建一个类Stock,含字符数组stockcode[]及整型数组成员quan、双精度型数据成员
3.35
price。
构造函数含3个参数:
字符数组na[]及q、p。
当定义Stock的类对象时,将对象的第一个字符串参数赋给数据成员stockcode,第2和第3个参数分别赋给quan、price。
未设置
第2和第3个参数时,quan的值为1000,price的值为8.98.成员函数print没有形参,需使用this指针,显示对象数据成员的内容。
编写程序显示对象数据成员的值。
#includeusingnamespacestd;classStock{private:
charstockcode[25];intquan;doubleprice;
public:
Stock(
Stock(void};
charna[],intcharna[]);
print();
q=1000,doublep=8.98);
Stock:
:
Stock(charna[],{
strcpy(stockcode,na);quan=q;price=p;
}voidStock:
:
print(){
cout<<"stockcode:
"
intq=1000,doublep=8.98)
<stockcode<<"quan:
"<quan
<<"price:
"<price<intmain()
{
Stockstock1(
Stockstock2(
stock1.print();
stock2.print();return0;
}
"600001",3000,5.67);
"600002");
3.36编写一个程序,
数据并计算出学生人数和平均成绩(要求将学生人数和总成绩用静态数据成员表示)。
已有若干学生的数据,包括学号、姓名、成绩,要求输出这些学生的
#include
usingnamespacestd;
classstudent
{
private:
charname[25],studentNo[intscore;
static
static
public:
student(
intsum;
inttotalScore;
charna[],char
voidshow();staticvoidshowTotal();
};
student:
:
student(charna[],
{
strcpy(name,na);strcpy(studentNo,stuNo);score=sc;
++sum;
totalScore+=sc;
}
voidstudent:
:
show()
{
cout<<
cout<<
cout<<
}
"姓名"学号"成绩
II
II
II
10];
stuNo[],intsc);
charstuNo[],intsc)
<<<voidstudent:
:
showTotal()
{
cout<<
cout<<
"总人数:
"<"平均成绩:
"<<(double)totalScore/sum<
student:
:
sum=0;student:
:
totalScore=main()
int
int
int
{
students1(
students2(
students3(
s1.show();
s2.show();
s3.show();
student:
:
showTotal();
return0;
}
"张无忌",
"李莫愁",
"小龙女",
0;
"111254",
"254114",
"112587",
75);
60);
88);
4.1有哪几种继承方式?
每种方式的派生类对基类成员的继承性如何
公有继承,私有继承和保护继承。
基类的私有成员,无论哪种继承方式都不能访问。
公有继承不改变基类的公有和保护成员的访问限制。
私有继承将基类的公有和保护成员都变成私有。
保护继承将基类的公有和保护成员都变成保护。
4.2派生类能否直接访问基类的私有成员?
若否,应如何实现?
不能。
可以在基类里添加一个公有成员函数来访问私有成员,
派生类就能继承这个公有成员函数,实现对基类私有成员的访问。
4.3保护成员有哪些特性?
保护成员以公有方式或私有方式继承后的访问特性如何?
保护成员只能被本类或本类的派生类所访问,在类或派生类外是不能被访问的。
后面一问见第一题的答案。
4.4派生类构造函数和析构函数的执行顺序是怎样的?
构造函数是先执行父类的构造函数,再执行类中其他类对象
的构造函数,再执行本类的构造函数。
如果同级有多个构造函数,则按声明顺序执行。
析构函数与构造函数的执行顺序刚好相反。
4.5
派生类名(参数总表)
基类名(参数总表)
派生类构造函数和析构函数的构造规则是怎样的?
派生类新增数据成员的初始化语句
派生类中的析构函数与基类无关。
4.6什么是多继承?
多继承时,构造函数与析构函数的执行顺序是怎样的?
多继承是指一个类同时继承自多个不同的基类。
执行顺序同4.4
4.7在类的派生中为何要引入虚基类?
虚基类构造函数的调用顺序是如何规定的?
如果一个类有多个直接基类,而这些直接基类又有一个共同
的基类,则在最底层的派生类中会保留这个简介的共同基类数据成员的多份同名成员。
在访问这些同名成员的时候,会产生二义性。
为了解决二义性,引入了虚基类。
1)如果虚基类中定义有带形参的构造函数,并且没有定义默认形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的成员初始化表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。
2)建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。
该派生类的其他基类对虚基类构造函数的调用都自动被忽略。
3)若同一层次中