c++關於靜態、友元、常量成員的複習整理

一、靜態成員

靜態成員包含靜態變量和靜態函數。
靜態成員的性質:
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章