函数定义包含两部分的内容:属性和行为
只是他们在题目中经常还使用其他不同的名字,所以我们整理出下表对此进行整理归纳:
书P115,对于对象和类有(进行了)两种不同的定义:(事实上,我认为第二种是扯淡)
1:
对象:随便一个什么我们针对描述的实体
类:对一些对象的共性的抽象描述
2:
对象:随便一个什么我们针对描述的实体
由数据(描述事物的属性)作用于数据的操作(体现事物的行为)构成一独立整体
类:对象在计算机中的反映
将数据以及这些数据上的操作封装在一起
是面向对象程序设计的核心
它实际是一种新的数据类型,也是实现抽象类型的工具
书P118:
关于成员函数的声明原型和函数实现(定义)的详细整理:
(成员函数)声明原型:都在class定义中声明原型
(成员函数的)实现(定义的给出):
- 可以在类中定义,在类中给出整个函数体,形成内联成员函数
- 也可以在类外(类的定义之外)给出函数的定义(需要在函数名前使用“类名:”加以限定)
例8-3类Clock外部定义成员函数的具体形式。
源程序:
一:(在类外(类的定义之外)给出函数的定义)
书上的程序(更准确的说,不如说是一个程序块):
void Clock::SetTime(int NewH, int NewM, int NewS)
{
Hour = (NewH >= 0 && NewH < 24) ? NewH : 0; //设置时间
Minute = (NewM >= 0 && NewM < 60) ? NewM : 0;
Second = (NewS >= 0 && NewS < 60) ? NewS : 0;
}
void Clock::ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
将其补充为完整程序实现:
#include <iostream>
using namespace std;
//类的定义
class Clock
{
private:
int Hour, Minute, Second;
public:
void SetTime(int NewH, int NewM, int NewS);
void ShowTime();
};
//函数的实现,在类外(类的定义之外)给出函数的定义
void Clock::SetTime(int NewH, int NewM, int NewS)
{
Hour = (NewH >= 0 && NewH < 24) ? NewH : 0;
Minute = (NewM >= 0 && NewM < 60) ? NewM : 0;
Second = (NewS >= 0 && NewS < 60) ? NewS : 0;
}
void Clock::ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
//主函数
int main()
{
Clock myClock;//定义对象
myClock.SetTime(8, 30, 0);
myClock.ShowTime();
return 0;
}
结果:
但是,我们要注意:
在类外(类的定义之外)给出函数的定义的时候,遵循和函数体当中一样
(要么先声明后定义,要么你索性就直接在需要这个函数的地方直接写下这个函数完整的定义)
的原则
在这里,如果我们把函数的定义写在函数的声明之前,那么程序就会报错:
#include <iostream>
using namespace std;
//函数的实现,在类外(类的定义之外)给出函数的定义
void Clock::SetTime(int NewH, int NewM, int NewS)
{
Hour = (NewH >= 0 && NewH < 24) ? NewH : 0;
Minute = (NewM >= 0 && NewM < 60) ? NewM : 0;
Second = (NewS >= 0 && NewS < 60) ? NewS : 0;
}
void Clock::ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
//类的定义
class Clock
{
private:
int Hour, Minute, Second;
public:
void SetTime(int NewH, int NewM, int NewS);
void ShowTime();
};
int main()
{
}
另外,在这里其实我还有一个不是那么重要的小疑惑:
为什么如果我指定一类但不写主函数,这程序就一定会报错?
其实书上早就写了:
一个程序当中(必须)有且仅有一个主函数
二:在类中定义,在类中给出整个函数体,形成内联成员函数
同样的,书上的程序
(1):
class Clock
{
private:
int Hour, Minute, Second;
public:
void SetTime(int NewH, int NewM, int News);
void ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
};
补充为完整程序:
#include <iostream>
using namespace std;
//类的定义
class Clock
{
private:
int Hour, Minute, Second;
public:
void SetTime(int NewH, int NewM, int News);
void ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
};
int main()
{
}
(但是这里)对于书上的这种用法,很有意思的是:
如果采用这种写法,我们想在主函数里面使用(实现)函数时
必须附加上“SetTime(int NewH, int NewM, int NewS)”函数的定义才能运行;
没有附加:
#include <iostream>
using namespace std;
//类的定义
class Clock
{
private:
int Hour, Minute, Second;
public:
void SetTime(int NewH, int NewM, int News);
void ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
};
int main()
{
Clock myClock;//定义对象
myClock.SetTime(8, 30, 0);
myClock.ShowTime();
return 0;
}
结果: 附加:
#include <iostream>
using namespace std;
//类的定义
class Clock
{
private:
int Hour, Minute, Second;
public:
void SetTime(int NewH, int NewM, int News);
void ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
};
void Clock::SetTime(int NewH, int NewM, int NewS)
{
Hour = (NewH >= 0 && NewH < 24) ? NewH : 0;
Minute = (NewM >= 0 && NewM < 60) ? NewM : 0;
Second = (NewS >= 0 && NewS < 60) ? NewS : 0;
}
int main()
{
Clock myClock;//定义对象
myClock.SetTime(8, 30, 0);
myClock.ShowTime();
return 0;
}
结果:
而在形成内联成员函数的情况下,又分为两种情况:隐式声明和显式声明
而在这里(上面)我们默认写出来的内联函数的情况
没有什么用明显的关键字的声明,我们称之为隐式声明
与之相对应的,另一种“在函数返回值类型前要加上inline关键字”的情况,我们称之为显式声明:
书上的:
(2):
inline void Clock::ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
补充为完整程序:
#include <iostream>
using namespace std;
//类的定义
class Clock
{
private:
int Hour, Minute, Second;
public:
void SetTime(int NewH, int NewM, int News);
void ShowTime();
};
inline void Clock::ShowTime()
{
cout << Hour << ":" << Minute << ":" << Second << endl;
}
int main()
{
}
而这里有趣的是,虽然显示声明属于内联函数的一种,但是显式声明的函数定义却在类体之外
这无疑和内联函数的定义违背
这你又怎么解释?
书P121:
类的成员函数也可以有默认参数值,它的调用规则与普通函数相同。
尝试具体实现:
#include <iostream>
using namespace std;
//类的定义
class A
{
private:
int a=0, b=0, c=0;
public:
int add(int a,int b,int c)
{
cout << (a + b + c) << endl;
return 1;
}
};
int main()
{
A A1;
A1.add(1, 2, 3);
return 0;
}
结果:6
类的成员变量可以有默认参数值