一.pta错题
2-1如果默认参数的函数声明为“ void fun(int a,int b=1,char c=‘a’,float d=3.2);”,
则下面调用写法正确的是( )。 (2分)
fun();
fun(2,3); //得把没有实参的变量放在最后
fun(2, ,‘c’,3.14)
fun(int a=1);
2-11一个函数为void f(int x, char y = ‘a’),另一个函数为void f(int),则它们____。 (2分)
不能在同一程序块中定义
可以在同一个程序块中定义并可重载
可以在同一个程序块中定义,但不可以重载
以上说法均不正确
//有无参数值同时出现,会造成编译错误!
BA
二.实例
1.类的实现
#include<iostream>
using namespace std;
class Clock{
public:
void setTime(int h=0,int m=0,int s=0);
void showTime();
private:
int hour,minute,second;
};
int main(){
Clock myClock;
myClock.setTime(8,30,30);
myClock.showTime();
return 0;
}
void Clock::setTime(int h,int m,int s)
{hour=h;
minute=m;
second=s;
}
void Clock::showTime()
{cout<<hour<<":"<<minute<<":"<<second;
}
2.引用
#include<iostream>
using namespace std;
void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
int main() {
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
swap(x, y);
cout << "x = " << x << " y = " << y << endl;
return 0;
}
**声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。
一旦一个引用被初始化后,就不能改为指向其它对象。
引用可以作为形参void swap(int &a, int &b) {…}
3.默认参数值与函数的调用位置
如果一个函数有原型声明,且原型声明在定义之前,则默认参数值必须在函数原型声明中给出;
int add(int x = 5,int y = 6);//原型声明在前
int main() {
add();
}
int add(int x,int y) {//此处不能再指定默认值
return x + y;
}
而如果只有函数的定义,或函数定义在前,则默认参数值需在函数定义中给出。
int add(int x=5,int y=6){//只有定义,没有原型声明
return x + y;
}
int main() {
add();
}
4.构造函数
//用来初始化成员
#include<iosteam>
using namespace std;
class Clock {
public:
Clock(int h,int m,int s);
void setTime(int h, int m, int s);
void showTime();
private:
int hour, minute, second;
};
//或者Clock::Clock(int h, int m, int s): hour(h),minute(m), second(s) { }(列表形式)
Clock::Clock(int h, int m, int s)
{
hour=h;
minute=m;
second=s;
}//(传统函数形式)
int main() {
Clock c1(0,0,0),c2(12,12,12);
//定义对象时自动调用构造函数
c1.showTime();
c2.showTime();
return 0;
}
特征
- 没有返回值,void也不行
- 函数名字和类名相同
- 必须是public
- 自动调用
- 构造函数可以是内联函数、重载函数、带默认参数值的函数
注意:传递的参数个数要一致
5.复制构造函数
#include<iostream>
using namespace std;
class Point { //Point 类的定义
public:
Point(int xx, int yy)
{ x = xx; y = yy; } //构造函数,内联
Point(Point& p); //复制构造函数
private:
int x, y; //私有数据
};
Point::Point (Point& p) {
x = p.x;
y = p.y;//可以访问私有数据
cout << "Calling the copy constructor " << endl;
}i
nt main() {
Point a(4, 5);
Point b = a; //调用复制构造函数
Point c(a); //调用复制构造函数
}
6.析构函数
完成对象被删除前的一些清理工作。
在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
如果程序中未声明析构函数,编译器将自动产生一个隐含的析构函数。
局部对象,在退出程序块时析构
静态对象,在定义所在文件结束时析构
全局对象,在程序结束时析构
继承对象,先析构派生类,再析构父类
对象成员,先析构类对象,再析构对象成员
编译器默认提供的函数
class Empty{
public:
Empty(){}
Empty(Empty& rhs){…}
~Empty(){}
};