1.钟表类
#include<iostream>
using namespace std;
class Clock {
public:
void setTime(int newH = 0, int newM = 0, int newS = 0);
void showTime();
private:
int hour, minute, second;
};
void Clock::setTime(int newH, int newM, int newS) {
hour = newH;
minute = newM;
second = newS;
}
void Clock::showTime() {
cout << hour << ":" << minute << ":" << second;
}
int main() {
Clock myClock;
myClock.setTime(21, 26, 30);
myClock.showTime();
return 0;
}
2.构造函数
析构函数——完成对象被删除前的清理工作。编译器会提供默认的析构函数,其函数体为空。
析构函数没有参数,没有返回类型,不能重载。
类的组合概念:
类的成员是另一个类的对象,可以在已有的抽象的基础上实现更复杂的抽象。
——组合类的构造函数怎么设计呢?
组合类有没有权利去访问部件对象内部的私有成员?没有!只有本类的成员函数可以访问,类外不能访问,而且,部件类的设计开发者可能不是一个人。
原则:不仅要负责对本类的基本类型成员初始化,还要对对象成员初始化。
扫描二维码关注公众号,回复:
4808355 查看本文章
声明形式:类名:类名(对象成员所需的形参,本类成员形参):对象1(参数),对象2(参数),...{函数体其他语句}
构造函数的初始化次序:
- 初始化顺序:按照成员在类体中定义的顺序
- 调用顺序:按照对象成员的定义顺序,先声明者先构造(初始化列表中未出现的成员对象,调用默认构造函数初始化)
- 执行完初始化列表后,再执行构造函数的函数体。
如果作为部件对象的所属类没有定义默认构造函数,那在初始化组合类对象时,是不是必须得给部件类的对象传递参数?是的,如果不传参数,编译器就会报错。
如果写一个类,希望它能被经常被复用,那么要记住,不管写了多少个构造函数,都要写一个不带参数的默认构函数,因为当这个类的对象用在其他类的部件成员时,可能那个组合类根本就不写构造函数,就用默认构造函数。如果组合类不写构造函数,就没办法给部件对象传参数,这个时候就需要部件对象的一定得有默认构造函数。
#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx=0,int yy=0)
{
int x=xx;
int y=yy;
}
Point(Point &p); //复制构造函数
int getx(){return x;}
int gety(){return y;}
private:
int x,y;
};
Point::Point(Point &p)
{
x=p.x;
y=p.y;
cout<<"calling the copy constructor"<<endl;
}//成员函数的实现
void fun1(Point p)
{
cout<<p.getx()<<endl;
}//形参为Point类对象的函数
Point fun2()
{
Point a(1,2);
return a;
}//返回值为Point类的对象
int main()
{
Point a(4,5);
Point b=a; //1.用A初始化B,第一次调用拷贝构造函数
cout<<b.getx()<<endl;
fun1(a); //2.对象B做fun1的实参,第二次调用拷贝构造函数
b=fun2(); //3.函数的返回值是类对象,函数返回时,调用拷贝构造函数
cout<<b.getx()<<endl;
return 0;
}