- 面向对象:封装,继承,多态
#include <iostream>
using namespace std;
class Clock{//类命首字母一般大写
public:
//Clock(){} 构造函数(Constructor)函数名与类名一样,没有任何返回值类型,定义类时自动调用
//如果定义了构造函数,C++不再自动定义
Clock(){//定义构造函数时,保证有一个能涵盖默认构造函数
hour=minute=0;
cout<<"Create Clock"<<' '<<hour<<' '<<minute<<endl;
}
Clock(int h,int m){
hour=h;
minute=m;
cout<<"Create Clock"<<' '<<hour<<' '<<minute<<endl;
}
~Clock(){//析构函数(de-Constructor)只能有一个,不能重载,不能带参数,销毁时自动调用
cout<<"Clock"<<' '<<hour<<' '<<minute<<endl;
}//调用顺序与构造函数相反(构造函数按定义顺序调用)
void setTime(int h){//函数重载(overload),参数表不一样
hour = h;
minute = 0;
}
void setTime(int h,int m = 0)//带缺省值(默认值)的函数,参数从左向右传递,因此当定义默认值时,从这个参数往后都要有默认值
{
setHour(h);//可以调用其它成员方法
setMinute(m);
// hour = h;
// minute = m;
}
//当同时使用函数重载与缺省值的时候,要考虑是否冲突,如上述情况当只给一个参数的时候会有歧义
void setHour(int h){//成员方法
hour = h;
//this->hour = hour //this指针,类似于结构体调用成员,当参数名与数据成员名一样时必须用this
}
void setMinute(int m){//首字母小写,第二个字母大写
minute = m;
}
void showTime(){
cout<<hour<<":"<<minute<<endl;
}
bool compareBefore(const Clock &c)//const:限定c不能修改,常引用
{
if(hour==c.hour)
return minute<c.minute;
return hour<c.hour;
}
private://习惯private的数据成员放最后
int hour,minute;//数据成员
};
int main()
{
Clock c1,c2(20,35);//定义对象,申请内存,存数据成员和函数地址
Clock clocks[3]={Clock(20,46),Clock(20,46)};// 有几个初始化几个
Clock *pc = new Clock(20,43);//pc指针指向新对象,c++不会自己释放
// c1.setHour(19);//目前所学,通过对象调用成员函数
// c1.setMinute(25);
// c1.showTime();
// c2.setTime(19,35);
// c2.showTime();
// cout<<c1.compareBefore(c2)<<endl;
// c3.setTime(18);//error: call of overloaded 'setTime(int)' is ambiguous 出现歧义
int a = 10;
int c = 20;
int &b = a;//引用(reference),这里&表示引用,相当于给a起了别名,还是原来那个东西
const int &d = a;//常引用,不能通过常引用改变a的值
cout<<a<<' '<<b<<' '<<c<<endl;
b = c;//相当于赋值给a
c = 30;
cout<<a<<' '<<b<<' '<<c<<endl;
// int &b; 使用引用必须初始化,且定义引用之后不能更改
delete pc;
return 0;
}