prohect03.cpp
#include <iostream>
#include "Time.h"
using namespace std;
//普通函数,后面加onst是编译错误的。需要在成员函数后面加const(即类的成员函数)
//因为const放在成员函数后,表示不能修改该对象的成员变量
//void ptfunc() const
//{
// return ;
//}
//静态成员变量定义(分配内存)
int Time::mystatic=15;//可以不给初值,那么系统默认给0,定义时不需要使用static.
int main()
{
//二:成员函数末尾的const
//const:常量,在成员函数末尾增加一个const。不但要在成员函数声明中增加const, 也要在成员函数定义中增加const
//作用:告诉系统,这个成员函数,不会修改该对象里任何成员变量的值等等。也就是说,这个成员函数不会修改类Time的任何状态
//末尾加一个const后缀的成员函数 “常量成员函数”
const Time abc;
Time def;
//abc.addMinute(200); 不可以,addMinute()不是const成员函数,这个addMinute()只能被非const对象调用
def.addMinute(1500);
def.addHour(1);
//const成员函数,则不管是const对象,还是非const,都可以调用const成员函数
//而非const成员函数,不能够别const对象调用,只能被非const对象调用
//三:mutable(不稳定,容易改变的意思),const的反义词。mutable的引入也正好是为了突破const的限制
//用mutable修改一个成员变量,一个成员变量一旦被mutable修饰了,就表示,这个成员变量永远处于可以被修改的状态,即便是const结尾的成员函数中,也可以修改
//四:返回自身对象的引用,this
//如何理解这个this, 我们调用成员函数时,编译器负责把这个对象的地址(&myTime)传递给这个成员函数中一个隐藏的this形参。
//在系统角度看来,任何对类成员的直接访问都被看做是通过this做隐式调用的
//a)this指针只能在成员函数中使用,全局函数、静态函数都不能使用this指针
//b)在普通成员函数中,this是一个指向非const对象的const指针(类型为Time,那么this 就是Time *const this),表示this只能指向当前Time
//c)在const成员函数中,this指针是一个指向const对象的const指针(类型为Time, this 就是const Time *const this类型的指针)
//五:static成员
//有属于整个类的成员变量,这种成员变量就叫static成员变量(静态成员变量)
//特点:不属于某个对象,属于整个类,我们一旦在某个对象中修改了这个成员变量的值,在其他对象中直接能看到该后的结果。
//这种成员变量只有一个副本,对于这种成员变量的引用,我们用的是类名::成员变量名
//成员函数前面也可以加stataic构成 静态成员变量,属于整个类的成员函数。调用时: 类名::成员函数名
Time myTime;
myTime.add_hour(3);//myTime.add_hour(&myTime.3);
return 0;
}
Time.h
#include<iostream>
class Tmpclass
{
public:
Tmpclass()
{
std::cout<<"调用了Tmpclass的构造函数"<<std::endl;
}
Tmpclass(Tmpclass &tmpclass)
{
std::cout<<"调用了Tmpclass类的拷贝构造函数"<<std::endl;
}
};
class Time
{
public:
Time();
explicit Time(int tmphour);
Time(int tmphour,int tmpmin);
explicit Time(int tmphour,int tmpmin, int tmpsec);
//拷贝构造函数
Time(const Time &tmptime,int a=56);
Time &operator=(const Time&);//重载的赋值运算符
void addHour(int tmpHour) const;
void addMinute(int tmpMinute);
Time& add_hour(int tmpHour);
static int mystatic;//声明静态成员变量,还没有分配内存,所以也不能在这里初始化
static void mstafunc(int testvalue);
int Hour;
int Minute;
int Second;
Tmpclass c1;
};
Time.cpp
#include "Time.h"
#include <iostream>
//拷贝构造函数
Time::Time(const Time &tmptime,int a)
{
std::cout<<"调用了Time::Time(const Time &tmptime,int a)拷贝构造函数"<<std::endl;
}
Time::Time()
{
std::cout<<"调用了Time::Time()构造函数"<<std::endl;
}
void Time::addHour(int tmpHour) const
{
// this->Hour+=tmpHour; 这句话就会报错,不能修改对象的值
}
void Time::addMinute(int tmpMinute)
{
this->Minute+=tmpMinute;
}
Time& Time::add_hour(int tmpHour)
{
Hour+=tmpHour; //this->Hour+=tmpHpur;
return *this; //把对象自己给返回去了
}
//Time& Time::add_hour(Time *const this,int tmpHour)
//{
//
//}
//静态函数只能包含静态的成员变量
//非静态函数可以包含静态或非静态的成员变量
void Time::mstafunc(int testvalue)
{
//Minute=20;//错误,因为Minute成员变量和对象相关的成员变量
mystatic=17; //可以,因为mystati和类相关
}
//赋值运算符重载
Time& Time::operator=(const Time& tmpobj)
{
this->Hour=tmpobj.Hour;
this->Minute=tmpobj.Minute;
this->Second=tmpobj.Second;
std::cout<<"调用了 Time& Time::operator=(const Time& tmpobj)赋值运算符重载"<<std::endl;
return *this;
}