在普通的成員函數(shù)中上渴,不管有沒有定義形參
系統(tǒng)都會(huì)自動(dòng)的加上一個(gè)隱藏的形參
該形參的類型為該類的指針類型-->(Score *)
該指針的作用:用來存放當(dāng)前調(diào)用該成員函數(shù)對(duì)象的地址
一般將該指針稱為this指針
Score::inScore(&s);
this->m_iNum;
特殊的成員函數(shù)
static
static 沒有 this 指針
static 既可以通過類對(duì)象調(diào)用,也可以通過類名調(diào)用
static 函數(shù)中不能訪問和操作普通的成員變量轮听,
只能訪問和操作靜態(tài)的成員變量
一般將不需要訪問和操作普通的成員變量的函數(shù)
但又和該類相關(guān)的函數(shù)申明定義為 static 成員函數(shù)
如果 static 成員變量在類外定義去团,則不需要加關(guān)鍵字 static
const
void show() const
有隱藏的 this 指針
由于成員函數(shù)聲明為 const 成員函數(shù)更振,
該 this 指針會(huì)轉(zhuǎn)變成為:const show *this
不能修改普通成員變量的值 -->const Show *this
但是可以修改靜態(tài)成員變量 static 的值
一般將只訪問不涉及修改成員變量的函數(shù)
申明為const成員函數(shù)宙帝,以防意外修改了成員變量
const成員函數(shù)只能被類對(duì)象調(diào)用
繼承
多繼承
虛繼承(選擇繼承,多級(jí)繼承可去重)
class Teacher: virtual public person
派生類會(huì)自動(dòng)在類中添加一個(gè)指針
通過該指針來訪問基類數(shù)據(jù)
由最派生類來真正繼承被虛繼承的類
被虛繼承的類中的成員的初始化由最派生類來負(fù)責(zé)
#include <iostream>
using namespace std;
class Score
{
public:
//在普通的成員函數(shù)中捌锭,不管有沒有定義形參
//系統(tǒng)都會(huì)自動(dòng)的加上一個(gè)隱藏的形參
//該形參的類型為該類的指針類型--> (Score *)
//該指針的作用:用來存放當(dāng)前調(diào)用該成員函數(shù)對(duì)象的地址
//一般將該指針稱之為this指針
#if 0
void inScore(Score *this)
{
cin >> this->m_iNum >> this->m_fMath
>> this->m_fEnglish >> this->m_fProgramming;
this->m_fAvgScore = (this->m_fMath+this->m_fEnglish
+this->m_fProgramming)/3;
}
#endif
void inScore()
{
cin >> m_iNum >> m_fMath
>> m_fEnglish >> m_fProgramming;
m_fAvgScore = (m_fMath+m_fEnglish
+m_fProgramming)/3;
}
void showScore()
{
cout << "id:" << m_iNum
<< " score:" << m_fMath
<< ' ' << m_fEnglish
<< ' ' << m_fProgramming
<< " avgScore:" << m_fAvgScore << endl;
}
//1,static函數(shù)沒有this指針
//2,static函數(shù)既可以通過類對(duì)象調(diào)用俘陷,
// 也可以通過類名調(diào)用
//3,static函數(shù)中不能訪問和操作普通的成員變量
// 只能訪問和操作靜態(tài)的成員變量
//4,一般將不需要訪問和操作普通的成員變量的函數(shù)
// 但又和該類相關(guān)的函數(shù)申明定義為static成員函數(shù)
//5,如果static成員變量在類外定義,則返回值類型前
// 不需要加static關(guān)鍵字
static void showHappy()
{
//cout << m_iNum << endl;
cout << m_iTestData << endl;
int iData = 90;
cout << "iData=" << iData << endl;
cout << "I am no.1, hahahahaha..." << endl;
}
static Score &getInstance();
private:
int m_iNum;
float m_fMath;
float m_fEnglish;
float m_fProgramming;
float m_fAvgScore;
static int m_iTestData;
};
Score& Score::getInstance()
{
static Score s;
return s;
}
int Score::m_iTestData = 19999;
int main(void)
{
Score s;
Score s2;
s.showHappy();
Score::showHappy();
Score &ref = Score::getInstance();
return 0;
}
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(){cout << "Person()...\n";}
Person(string id, string name
, int age, char sex, string addr)
{
m_strId = id;
m_strName = name;
m_iAge = age;
m_cSex = sex;
m_strAddress = addr;
cout << "Person(paragms..)...\n";
}
void info() const
{
cout << m_strId << ' ' << m_strName
<< ' ' << m_iAge << ' ' << m_cSex
<< ' ' << m_strAddress << endl;
}
private:
string m_strId;
string m_strName;
int m_iAge;
char m_cSex;
string m_strAddress;
};
//1,繼承方式:public,protected,private
// 繼承方式其實(shí)是對(duì)繼承過來的成員進(jìn)行封裝
//2,若沒有指定繼承方式,則默認(rèn)為private繼承
// class Teacher: Person-->class Teacher: private Person
//3,只有一個(gè)繼承,稱之為單繼承
//4,將被繼承的類稱之為基類
//5,新產(chǎn)成的類稱之為派生類
//6,派生類需要對(duì)繼承過來的數(shù)據(jù)和本身新增成員進(jìn)行初始化
//7,對(duì)繼承過來的成員初始化方式:
// 在派生類構(gòu)造函數(shù)的初始化列表中观谦,
// 顯式或者隱式的調(diào)用基類的構(gòu)造函數(shù)來對(duì)數(shù)據(jù)進(jìn)行初始化
// 隱式的調(diào)用基類的構(gòu)造函數(shù):默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
class Teacher: public Person
{
public:
#if 0
//以下兩種情況:默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
// 對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
//即沒有在派生類的初始化列表中寫上基類的構(gòu)造函數(shù)
//則默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
Teacher(){cout << "Teacher()...\n";}
Teacher(string courseName, float salary)
{
cout << "Teacher(paramgms..)...\n";
}
#endif
//Teacher(): Person()
Teacher(): Person("000", "newperson", 0, 'm', "china")
{
cout << "Teacher()...\n";
}
//Teacher(string courseName, float salary):Person()
Teacher(string id, string name
, int age, char sex, string addr
, string courseName, float salary)
: Person(id, name, age, sex, addr)
{
m_strCourseName = courseName;
m_fSalary = salary;
cout << "Teacher(paramgms..)...\n";
}
void info()
{
Person::info();
cout << m_strCourseName << ' ' << m_fSalary << endl;
}
private:
string m_strCourseName;
float m_fSalary;
};
int main(void)
{
#if 0
Person p("1001", "zhangsan", 18, 'f', "shanghai");
p.info();
#endif
//Teacher tec;
//Teacher tec2("chinese", 9000);
Teacher tec("1001", "xiaohua", 28, 'f', "nanhai"
, "english", 9000);
tec.info();
return 0;
}
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(){cout << "Person()...\n";}
Person(string id, string name
, int age, char sex, string addr)
{
m_strId = id;
m_strName = name;
m_iAge = age;
m_cSex = sex;
m_strAddress = addr;
m_strFace = "cool";
cout << "Person(paragms..)...\n";
}
void info() const
{
cout << m_strId << ' ' << m_strName
<< ' ' << m_iAge << ' ' << m_cSex
<< ' ' << m_strAddress << endl;
}
string m_strFace;
private:
string m_strId;
string m_strName;
int m_iAge;
char m_cSex;
string m_strAddress;
};
//1,繼承方式:public,protected,private
// 繼承方式其實(shí)是對(duì)繼承過來的成員進(jìn)行封裝
//2,若沒有指定繼承方式拉盾,則默認(rèn)為private繼承
// class Teacher: Person-->class Teacher: private Person
//3,只有一個(gè)繼承,稱之為單繼承
//4,將被繼承的類稱之為基類
//5,新產(chǎn)成的類稱之為派生類
//6,派生類需要對(duì)繼承過來的數(shù)據(jù)和本身新增成員進(jìn)行初始化
//7,對(duì)繼承過來的成員初始化方式:
// 在派生類構(gòu)造函數(shù)的初始化列表中,
// 顯式或者隱式的調(diào)用基類的構(gòu)造函數(shù)來對(duì)數(shù)據(jù)進(jìn)行初始化
// 隱式的調(diào)用基類的構(gòu)造函數(shù):默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
//class Teacher: public Person
//class Teacher: protected Person
class Teacher: private Person
{
public:
#if 0
//以下兩種情況:默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)
// 對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
//即沒有在派生類的初始化列表中寫上基類的構(gòu)造函數(shù)
//則默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)對(duì)繼承過來的數(shù)據(jù)進(jìn)行初始化
Teacher(){cout << "Teacher()...\n";}
Teacher(string courseName, float salary)
{
cout << "Teacher(paramgms..)...\n";
}
#endif
//Teacher(): Person()
Teacher(): Person("000", "newperson", 0, 'm', "china")
{
cout << "Teacher()...\n";
}
//Teacher(string courseName, float salary):Person()
Teacher(string id, string name
, int age, char sex, string addr
, string courseName, float salary)
: Person(id, name, age, sex, addr)
{
m_strCourseName = courseName;
m_fSalary = salary;
cout << "Teacher(paramgms..)...\n";
}
void info()
{
Person::info();
cout << m_strCourseName << ' ' << m_fSalary << endl;
cout << m_strFace << endl;
//cout << m_strName << endl;
}
private:
string m_strCourseName;
float m_fSalary;
};
//class Test:public Person;
int main(void)
{
Teacher tec("1001", "xiaohua", 28, 'f', "nanhai"
, "english", 9000);
tec.info();
// cout << tec.m_strFace << endl;
return 0;
}
//多繼承
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(){cout << "Person()...\n";}
Person(string id, string name
, int age, char sex, string addr)
{
m_strId = id;
m_strName = name;
m_iAge = age;
m_cSex = sex;
m_strAddress = addr;
cout << "Person(paragms..)...\n";
}
void info() const
{
cout << m_strId << ' ' << m_strName
<< ' ' << m_iAge << ' ' << m_cSex
<< ' ' << m_strAddress << endl;
}
private:
string m_strId;
string m_strName;
int m_iAge;
char m_cSex;
string m_strAddress;
};
//虛繼承,派生類會(huì)自動(dòng)在類中添加一個(gè)指針
//通過該指針來訪問基類數(shù)據(jù)
class Teacher: virtual public Person
{
public:
Teacher()
{
cout << "Teacher()...\n";
}
//Teacher(string courseName, float salary):Person()
Teacher(string id, string name
, int age, char sex, string addr
, string courseName, float salary)
: Person(id, name, age, sex, addr)
{
m_strCourseName = courseName;
m_fSalary = salary;
cout << "Teacher(paramgms..)...\n";
}
void info() const
{
Person::info();
cout << m_strCourseName << ' ' << m_fSalary << endl;
}
private:
string m_strCourseName;
float m_fSalary;
};
class Student: virtual public Person
{
public:
Student()
{
}
Student(string id, string name
, int age, char sex, string addr
, float math, float chinese
, float english, string grade)
: Person(id, name, age, sex, addr)
{
m_fMath = math;
m_fChinese = chinese;
m_fEnglish = english;
m_strGrade = grade;
cout << "Student(paragms..)...\n";
}
void info() const
{
Person::info();
cout << "score: " << m_fMath
<< ' ' << m_fChinese
<< ' ' << m_fEnglish
<< " 年級(jí):" << m_strGrade << endl;
}
private:
float m_fMath;
float m_fChinese;
float m_fEnglish;
string m_strGrade;
};
//多繼承情況時(shí),基類構(gòu)造函數(shù)的調(diào)用順序和繼承順序保持一致
//和在初始化列表中的前后順序無關(guān)
//在虛繼承情況下构挤,由最派生類來真正繼承被虛繼承的類
//被虛繼承的類中的成員的初始化由最派生類負(fù)責(zé)
class GraduateStudent: public Teacher, public Student
{
public:
GraduateStudent(){}
GraduateStudent(string id, string name
, int age, char sex, string addr
, float math, float chinese
, float english, string grade
, string courseName, float salary
, string level, string project)
: Student(id, name, age, sex, addr
, math, chinese, english, grade)
, Teacher(id, name, age, sex, addr
, courseName, salary)
, Person(id, name, age, sex, addr)
{
m_strLevel = level;
m_strProject = project;
cout << "GraduateStudent(params...)\n";
}
void info() const
{
Student::info();
Teacher::info();
cout << m_strLevel << ' ' << m_strProject << endl;
}
private:
string m_strLevel;
string m_strProject;
};
//person由Test真正繼承
class Test: public GraduateStudent
{};
int main(void)
{
GraduateStudent gs("1001", "xhangsan", 19
, 'f', "beijing", 90
, 98, 78, "二年級(jí)"
, "c++", 9000, "研究生"
, "機(jī)器自主學(xué)習(xí)");
gs.info();
cout << "person size:" << sizeof(Person) << endl;
cout << "student size:" << sizeof(Student) << endl;
cout << "teacher size:" << sizeof(Teacher) << endl;
cout << "graduate size:" << sizeof(GraduateStudent) << endl;
return 0;
}