>[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 類模板
- 第四章 運算符重載
- 數據類型轉換
- 運算符重載
- 重載流插入運算符和流提取運算符
- 第五章 繼承與派生
- 繼承與派生
- 第六章 多態性與虛函數
- 多態性
- 虛函數
- 純虛函數與抽象類