Bootstrap

PTA错题&函数实例

一.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;
}


特征

  1. 没有返回值,void也不行
  2. 函数名字和类名相同
  3. 必须是public
  4. 自动调用
  5. 构造函数可以是内联函数、重载函数、带默认参数值的函数

注意:传递的参数个数要一致

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(){}
};
;