一、靜態成員
靜態成員包含靜態變量和靜態函數。
靜態成員的性質:
1、類中的靜態數據成員,所有對象都共享這一個成員,這個靜態數據成員只有一份存在於內存中
2、類中的靜態函數成員,因爲他不屬於對象,所以在這個函數中只能操作類的靜態數據,靜態函數
3、類中的靜態數據成員,不管共有私有都是在類外進行初始化
(類型 類名::靜態成員=初始化值)
4、類中靜態數據成員初始化,靜態數據成員不屬於對象,無法通過對象的操作進行初始化,它是屬於類的
5、靜態數據成員,可以被重新賦值,可以被普通函數訪問
1、靜態變量
靜態成員變量是一種特殊的成員變量,它被關鍵字static
修飾
class Student
{
private:
char* m_name;
int m_age;
public:
static int m_total;
public:
Student(const char* name,int age);
void show();
~Student();
};
int Student::m_total = 0;//在類外初始化
Student::Student(const char* name,int age)
{
cout << "帶參構造" << endl;
m_name = new char[strlen(name) + 1];
strcpy(m_name, name);
this->m_age = age;
m_total++;
}
void Student::show()
{
cout << m_name<< "\t" << m_age << "\t" << m_total << "\t" <<endl;
}
Student::~Student()
{
cout << "析構" << endl;
if (m_name!=NULL)
{
delete[]m_name;
m_name = NULL;
}
}
int main()
{
Student stu1("小王",18);
stu1.show();
Student* stu2 = new Student("小孔", 18);
stu2->show();
system("pause");
return 0;
}
當把靜態變量設置爲私有屬性時,同樣需要在共有屬性中提供接口使用該靜態成員變量。
static 成員變量的內存既不是在聲明類時分配,也不是在創建對象時分配,而是在(類外)初始化時分配。因此,可以說沒有在類外初始化的 static 成員變量不能使用。
static 成員變量不佔用對象的內存,而是在所有對象之外開闢內存,即使不創建對象也可以訪問。
2、靜態函數
普通成員函數可以訪問所有成員(包括成員變量和成員函數),靜態成員函數只能訪問靜態成員。
class Student
{
private:
char* m_name;
int m_age;
public:
static int m_total;
static void Getsum();
public:
Student(const char* name,int age);
void show();
~Student();
};
int Student::m_total = 0;//在類外初始化
Student::Student(const char* name,int age)
{
cout << "帶參構造" << endl;
m_name = new char[strlen(name) + 1];
strcpy(m_name, name);
this->m_age = age;
m_total++;
}
void Student::Getsum()//靜態函數的定義
{
cout <<m_total<<endl;
}
void Student::show()
{
cout << m_name<< "\t" << m_age << "\t" << m_total << "\t" <<endl;
}
Student::~Student()
{
cout << "析構" << endl;
if (m_name!=NULL)
{
delete[]m_name;
m_name = NULL;
}
}
int main()
{
Student stu1("小王",18);
stu1.show();
stu1.Getsum();
Student* stu2 = new Student("小孔", 18);
stu2->show();
stu2.Getsum();
system("pause");
return 0;
}
在C++中,靜態成員函數的主要目的是訪問靜態成員,普通函數也可以直接訪問靜態成員。
二、常量成員
1、類中常量成員分爲兩種:常量數據成員和常量函數成員
2、類中的常量數據成員,必須要使用初始化列表的方式進行初始化 const int a;
3、類中的常量函數成員,這個函數不能對自身變量進行修改,這個是常量的特性 void fun() const {}
Ⅰ、受語法限定,只要是this指針所指向的所有數據,在這個函數裏面都不可以改
Ⅱ、初始化之外的形參數據,臨時變量,不屬於this指針的數據都可以改
Ⅲ、根據語法,可以幫助我們來限定去修改自身的數據
4、對象被說明說常量對象時,這個對象只能調用常量數據成員函數
Ⅰ、這個對象裏面的所有數據都是不可以被修改的
Ⅱ、可以對象裏面的靜態成員,因爲靜態成員不屬於對象
1、常量成員變量
const 成員變量的用法和普通 const 變量的用法相似,只需要在聲明時加上 const 關鍵字。想要對const成員變量初始化,應該藉助構造函數的初始化來進行。
2、常量函數成員
函數開頭的 const 用來修飾函數的返回值,表示返回值是 const 類型,也就是不能被修改
函數頭部的結尾加上 const 表示常成員函數,這種函數只能讀取成員變量的值,而不能修改成員變量的值
char* Student::getname()const
{
return m_name
}
三、友元成員
1、類的特點是封裝,友元是C++爲用戶提供打破這中封裝(數據隱藏)的手段
2、友元分爲兩種:友元函數,友元類
3、友元函數:是一個函數,這個函數不是對象的成員,對象是無法調用的,不管在哪裏定義,但是這個函數有權調用類的所有的私有成員以及保護成員 。
聲明友元函數:把函數的聲明寫在類中,無論私有共有保護,然後寫入friend +類型+ 函數名(形參)
4、友元類:類B爲類A的友元類
B類和A類是兩個類,友元類B必須在A類內說明(friend class B),B類所有成員函數都有權訪問A類的所有成員
5、友元的三個特點
Ⅰ、單方向:B是A的朋友,B可以訪問A的數據,A不可以訪問B的數據
Ⅱ、不傳遞:A是B的朋友,B是C的朋友,A和C沒有朋友關係
Ⅲ、不繼承:A是B的朋友,B是C的父親,A和C沒有關係
下面展示的是友元類的定義和使用,友元函數與其類似。
#include<iostream>
using namespace std;
class School;
class Student
{
private:
const char* m_name;
int m_age;
const char* m_sex;
public:
Student(const char* name, int age, const char* sex);
void show(School &school);
};
class School
{
private:
const char* m_schoolname;
const char* m_address;
public:
friend class Student;//友元類
public:
School(const char* shoolname, const char* address);
};
Student::Student(const char* name, int age,const char* sex): m_name(name), m_age(age), m_sex(sex) {}
School::School(const char* address,const char* school):m_schoolname(school),m_address(address){}
void Student::show(School& school)
{
cout << "姓名是" << m_name<<"\t" << "年齡是" << m_age<<"\t" << "性別:" << m_age << endl;
cout << "校址" << school.m_address<<"\t"<< "校名" << school.m_schoolname << endl;
}
int main()
{
Student stu("小王", 18, "男");
School school("山東", "一中");
stu.show(school);
system("pause");
return 0;
}