>[info]# **成员函数的性质**
- 类的成员函数与一般函数的区别只是: 它是属于一个类的成员,出现在类体中。
- 它可以被指定为private(私有的)、public(公用的)或protected(受保护的)。
- 成员函数可以访问本类中的任何成员,可以访问在本作用域中有效的数据。
>[info] # **类的声明**
## **::的两种用法:**
- 访问全局变量或全局函数(非成员函数)
- 作用域区分符
如:Tdate::month
Tdate::Print()
## **例子**
```
/* 在类里直接声明和定义函数 */
#include <iostream.h>
class Tdate{
public:
void Set(int m,int d,int y) //置日期值
{
month=m; day=d; year=y;
}
int IsLeapYear() //判是否闰年
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
void Print() //输出日期值
{
cout <<month <<“/” <<day <<“/” <<year
<<endl;
}
private:
int month;
int day;
int year;
};
void main()
{
Tdate a; //定义Tdate类对象a
a.Set(2,4,1998);
a.Print();
}
```
```
/* 在类里声明,类外定义 */
int month;
int day;
int year; //定义全局变量
void Set(int month,int day,int year) //定义set函数 非成员函数
{
::month=m;
::day=d;
::year=y;
}
class Tdate
{
public:
void Set(int month,int day,int year) //成员函数
{
::Set(m,d,y); //调用非成员函数
}
private:
int month;
int day;
int year;
};
void main()
{
Tdate a; //定义Tdate类对象a
a.Set(2,4,1998);
a.Print();
}
```
>[info]# **在类外定义成员函数**
为了防止甲方用你编写好的成员函数获取利益,我们会把成员函数的定义和声明分成两个文件写,只会把成员函数定义的 **obj** 文件和 **dll** 文件给对方。
```
/* 定义tdate.h 头文件 */
class Tdate
{
public:
void Set(int,int,int); //成员函数声明
int IsLeapYear();
void Print();
private:
int month;
int day;
int year;
};
```
```
/* 定义tdate.h 头文件中的成员函数 */
#include <iostream.h>
#include "tdate.h"
void Tdate::Set(int m,int d,int y)
{
month=m; day=d; year=y;
}
int Tdate::IsLeapYear()
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
void Tdate::Print()
{
cout <<month <<"/" <<day <<"/" <<year <<endl;
}
```
>[info]# **inline内联函数**
- C++系统中会自动把类中定义的成员函数当作内联函数
- 在程序调用这些成员函数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入程序的调用点。这样可以大大减少调用成员函数的时间开销。
## 注意
- 如果在**类外定义inline函数**,则必须**将类的定义和成员函数的定义放在同一个头文件中**(或**写在同一个源文件中**),否则编译时无法进行置换(将函数代码的拷贝嵌入函数调用点)。这样做,虽然提高了程序的执行效率,但是却降低了质量,不利于类的接口和类的实现的分离,不利于信息隐蔽。
- 只有在类外定义的成员函数规模很小而调用频率很高时才这样做
## **例子**
```
class Student
{
pubilc:
inline void display(); //声明此函数为内置函数
private:
int sum;
string name;
char sex;
};
inline void sTUDENT::display
{
cout<<"sum:"<<sum<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
```
>[info]# **成员函数的存储方式**
每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间,即**成员函数是被该类所有对象共享的**。
```
/* 定义tdate.h 头文件 */
class Tdate
{
public:
void Set(int,int,int); //成员函数声明
int IsLeapYear();
void Print();
private:
int month;
int day;
int year;
};
```
```
#include <iostream.h>
#include "tdate.h"
void Tdate::Set(int m,int d,int y) //定义Tdate类中的Set函数
{
month=m; //不能在month前加对象名
day=d;
year=y;
}
void Tdate::Print() //定义Tdate类中的Print函数
{
cout <<month <<"/" <<day <<"/" <<year
<<endl;
}
int Tdate::IsLeapYear() //定义Tdate类中的IsLeapYear函数
{
return(year%4==0&&year%100!=0)||(year%400==0);
}
void main()
{
Tdate s;
Tdate t;
s.Set(2,15,1998); /*该函数会生成一个this指针,指向s的存储空间,this=&s,在s的每个数据成员前 面都会加上this->,表示这个值赋予s中的数据成员*/
t.Set(3,15,1997);
s.Print();
t.Print();
}
```
- 介绍
- 编程设计语言
- 第一章 对C++的初步认识
- 1.2 最简单的C++程序
- 1.3 C++对C的补充
- 1.3.1 return
- 1.3.2 输入输出流
- 1.3.3 putchar 和 getchar
- 1.3.4 用const定义常变量
- 1.3.5 函数原型声明
- 1.3.6 内置函数
- 1.3.7 函数重载
- 1.3.8 函数模板
- 1.3.9 有默认值的参数
- 1.3.10 作用域
- 1.3.11 const修饰指针
- 1.3.12 引用
- 1.3.13 生命期
- 1.3.14 变量
- 1.3.15 字符串变量
- 第二章 类与对象
- 2.2 类的声明和对象的定义
- 2.3 类的成员函数
- 第三章 关于类和对象的进一步讨论
- 3.1 构造函数
- 3.1.1 对象的初始化
- 3.1.2 构造函数
- 3.2 析构函数
- 3.3调用析构函数和构造函数的顺序
- 3.4 对象数组
- 3.5 对象指针
- 3.6 共享数据的保护
- 3.7 对象的建立与释放
- 3.8 对象的赋值与复制
- 3.9 静态成员
- 3.10 友元
- 3.11 类模板
- 第四章 运算符重载
- 数据类型转换
- 运算符重载
- 重载流插入运算符和流提取运算符
- 第五章 继承与派生
- 继承与派生
- 第六章 多态性与虚函数
- 多态性
- 虚函数
- 纯虚函数与抽象类