例8-4时钟类的完整程序。
源程序:
- #include
- using namespace std;//类的定义
- class Clock
- {
- public:
- void SetTime(int NewH, int NewM, int NewS);
- 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 << endl;
- }
- //主函数
- int main()
- {
- Clock myClock;//定义对象
- myClock.SetTime(8, 30, 0);
- myClock.ShowTime();
- return 0;
- }
结果:
例8-5对象数组的使用方法。
源程序:
- #include
- using namespace std;
- class Box
- {
- private:
- int height;
- int width;
- int length;
- public:
- void SetBox(int h = 10, int w = 12, int len = 15)
- {
- height = h;
- width = w;
- length = len;
- }
- int volume();
- };
- int Box::volume()
- {
- return (height * width * length);
- }
- int main()
- {
- Box a[3]; //定义对象数组
- a[0].SetBox();
- a[1].SetBox(15, 18, 20);
- a[2].SetBox(16, 20, 26);
- cout << "volume of a[0] is " << a[0].volume() << endl;
- cout << "volume of a[1] is " << a[1].volume() << endl;
- cout << "volume of a[2] is " << a[2].volume() << endl;
- return 0;
- }
结果:
书P123:
可以通过对象(例如a[0])访问到他(对象数组)的公有成员
这里面的公有成员在这里(上述程序里)只包含了公有的那几个函数,不包含任何变量
也就是说在上述程序里我们已经用完了所有的公有成员,没办法输出任何对象数组的单个属性
除非将输出的属性改为公有:
- #include
- using namespace std;
- class Box
- {
- private:
- int width;
- int length;
- public:
- int height;
- void SetBox(int h = 10, int w = 12, int len = 15)
- {
- height = h;
- width = w;
- length = len;
- }
- int volume();
- };
- int Box::volume()
- {
- return (height * width * length);
- }
- int main()
- {
- Box a[3]; //定义对象数组
- a[0].SetBox();
- a[1].SetBox(15, 18, 20);
- a[2].SetBox(16, 20, 26);
- cout << a[0].height << endl;
- return 0;
- }
结果:
另外值得注意的是:
在输出时我们只能输出变量,不能输出形参,例如:(输入)
cout << a[1].h << endl;
结果:
修改例8-5,在主函数中定义以下语句:
- int main()
- {
- Box t;//定义t为 Box 类对象
- Box* pt;//定义 pt 为指向 Box类对象的指针变量
- pt = &t;//将t 的起始地址赋给 pt
- (*pt).SetBox();//调用 pt 所指向的对象中的 SetBox()函数,即t.SetBox
- cout << "Volume of a[0]is" << pt->volume() << endl;//调用pt 所指
- //向的对象中的Volume()函数,即t.Volume
- return 0;
- }
补充为完整程序:
- #include
- using namespace std;
- class Box
- {
- private:
- int height;
- int width;
- int length;
- public:
- void SetBox(int h = 10, int w = 12, int len = 15)
- {
- height = h;
- width = w;
- length = len;
- }
- int volume();
- };
- int Box::volume()
- {
- return (height * width * length);
- }
- int main()
- {
- Box t;//定义t为 Box 类对象
- Box* pt;//定义 pt 为指向 Box类对象的指针变量
- pt = &t;//将t 的起始地址赋给 pt
- (*pt).SetBox();//调用 pt 所指向的对象中的 SetBox()函数,即t.SetBox
- cout << "Volume of a[0]is" << pt->volume() << endl;//调用pt 所指
- //向的对象中的Volume()函数,即t.Volume
- return 0;
- }
结果:
例8-6有关对象指针的使用方法。
源程序:
- #include
- using namespace std;
- class Time
- {
- public:
- int Hour;
- int Minute;
- int Second;
- void SetTime(int H, int M, int S);
- void Get_Time();
- };
- void Time::SetTime(int H, int M, int S)
- {
- Hour = H;
- Minute = M;
- Second = S;
- }
- void Time::Get_Time()//定义公有成员函数
- {
- cout << Hour << ":" << Minute << ":" << Second << endl;
-
- }
-
- int main()
- {
- Time t1;//定义 Time 类对象 t1
- int* p1 = &t1.Hour;
- //定义指向整型数据的指针变量p1,并使 p1 指向 t1.Hour
- t1.SetTime(10, 13, 56);
- cout << *p1 << endl;
- //输出p1所指的数据成员t1.Hour
- t1.Get_Time();//调用对象t1的成员函数Get_Time
- Time* p2 = &t1; //定义指向 Time 类对象的指针变量 p2,并使 p2 指向t1
- p2->Get_Time();//调用 p2 所指向对象(即t1)的Get_Time 函数
- void(Time:: * p3)();//定义指向 Time 类公用成员函数的指针变量P3
- p3 = &Time::Get_Time;//使p3 指向 Time 类公用成员函数 Get_Time
- (t1.*p3)();//调用对象t1中p3所指的成员函数(即t1.Get_Time())
- return 0;
- }
结果:
对于t1:如果我们本身没有给t1赋值,即:将主函数改为
- int main()
- {
- Time t1;//定义 Time 类对象 t1
- int* p1 = &t1.Hour;
- //定义指向整型数据的指针变量p1,并使 p1 指向 t1.Hour
- cout << *p1 << endl;
- return 0;
- }
则输出一个任意值(系统随机分配的值):
另外,这里的
p2->Get_Time();等价于 (*p2).Get_Time();等价于 t1.Get_Time();
验证:
- #include
- using namespace std;
- class Time
- {
- public:
- int Hour;
- int Minute;
- int Second;
- void SetTime(int H, int M, int S);
- void Get_Time();
- };
- void Time::SetTime(int H, int M, int S)
- {
- Hour = H;
- Minute = M;
- Second = S;
- }
- void Time::Get_Time()//定义公有成员函数
- {
- cout << Hour << ":" << Minute << ":" << Second << endl;
-
- }
-
- int main()
- {
- Time t1;//定义 Time 类对象 t1
- t1.SetTime(10, 13, 56);
- t1.Get_Time();//调用对象t1的成员函数Get_Time
- Time* p2 = &t1; //定义指向 Time 类对象的指针变量 p2,并使 p2 指向t1
- p2->Get_Time();//调用 p2 所指向对象(即t1)的Get_Time 函数
- (*p2).Get_Time();
- t1.Get_Time();
- return 0;
- }
结果:
例8-7 this指针的作用
源程序:
- #include
- using namespace std;
- class A
- {
- private:
- int i;
- public:
- int get() const { return i;}
- void set(int x)
- {
- this->i = x;
- cout << "this 指针保存的内存地址为:" << this << endl;
- }
- };
- //
- int main()
- {
- A a;
- a.set(9);
- cout << "对象a所在的内存地址为:" << &a << endl;
- cout << "对象 a所保存的值为:" << a.get() << endl;
- cout << endl;
- A b;
- b.set(999);
- cout << "对象b所在的内存地址为:" << &b << endl;
- cout << "对象b 所保存的值为:" << b.get() << endl;
- return 0;
- }
结果:
问题:
一:代码段
this->i = x;
有意思(意义)吗?他这里不写这一段程序运行结果不也一样?
如果写了:
((this->i )= x;)
第一步:this指针指向i变量
注意:这里的this虽然是一个指针,但是这里用了成员选择符号“->”,它并不是指向目标对象的地址,而是访问目标对象
第二步:this指针(也就是this指针指向i变量)等于x;
如果没写:
(1):将对象的地址赋给this指针
(2):调用成员函数
二:他这里这个const的这个用法是什么意思?我好像没见过啊?
之前确实没学过const关于常量指针的用法:
const :
表示该函数不修改任何值;详见:35 类和对象-对象特性-const修饰成员函数_哔哩哔哩_bilibili
const:
回归到本例中,即表示(我们只要知道):成员函数get()不能改变成员变量i(即可)
参考与LSGO一起学“8指针(8.19 常量指针)”,试图用实践证明上述结论:
1.const修饰变量时,表示:该变量是常量;即:该变量不可改(变)
project 1:
- #include
- using namespace std;
- int main()
- {
- int a = 3;
- int const* p = &a;
- cout << "*p=" << *p << endl;
- cout << "a=" << a << endl;
- }
结果:
*p=3
a=3
project 2:
- #include
- using namespace std;
- int main()
- {
- int a = 3;
- int const* p = &a;
- *p = 4;
- cout <<"*p=" << *p << endl;
- cout << "a=" << a << endl;
- }
结果:
这里的: “p”: 不能给常量赋值;无疑已经说明:该(被const修饰的)变量是常量,不可改(变)。
project 3:
- #include
- using namespace std;
- int main()
- {
- int a = 3;
- int const* p = &a;
- p++;
- cout << "*p=" << *p << endl;
- cout << "a=" << a << endl;
- }
结果:
*p=-858993460
a=3
OK,到这里关于这个const我们先到这里点到为止
具体详细情况以后再说,详见与LSGO一起学“8指针(8.19 常量指针)”