C++06
區(qū)分new/delete malloc/free
new /delete 運算符芥映,不需要轉(zhuǎn)換,自動調(diào)用析構(gòu)函數(shù)
malloc /free 函數(shù)滚秩,返回值轉(zhuǎn)換专执,釋放空間
成員函數(shù)
在普通成員函數(shù)中,不管是否定義形參叔遂,系統(tǒng)都會自動加上一個隱藏的形參他炊,該形參類型為該類的指針類型,即( Score *)已艰。該指針的作用痊末,用來存放當前調(diào)用該成員函數(shù)對象的地址,一般將該指針稱之為this指針哩掺。
static成員函數(shù)
stastic 函數(shù)沒有this 指針
static函數(shù) 既可以通過類對象調(diào)用凿叠,也可以通過類名調(diào)用
static 函數(shù)中,不同訪問和操作普通成員變量嚼吞,只能訪問和操作靜態(tài)成員變量
一般將不需要訪問和操作普通成員變量函數(shù)盒件,但又和該類相關(guān)的函數(shù)聲明定義為static函數(shù),如果stastic成員變量舱禽,在類外定義炒刁,則返回值類型前不需要加stastic
#include <iostream>
using namespace std;
class Score
{
public:
//在普通的成員函數(shù)中,不管有沒有定義形參
//系統(tǒng)都會自動的加上一個隱藏的形參
//該形參的類型為該類的指針類型--> (Score *)
//該指針的作用:用來存放當前調(diào)用該成員函數(shù)對象的地址
//一般將該指針稱之為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ù)既可以通過類對象調(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;
}
const成員函數(shù)
#include <iostream>
#include <math.h>
using namespace std;
class Point
{
public:
Point(float x = 0.0f, float y = 0.0f)
{
m_x = x;
m_y = y;
}
//getX(Point *this)
float getX()
{
return m_x;
}
float getY()
{
return m_y;
}
//1,const成員函數(shù)有隱藏的this指針
//2,由于成員函數(shù)申明const成員函數(shù)
// 該this指針會轉(zhuǎn)變?yōu)? const Point *this
//3,不能修改普通成員變量的值-->const Point *this
// 但是可以修改static成員變量的值
//4,一般將只訪問不涉及修改成員變量的函數(shù)
// 申明為const成員函數(shù)翔始,以防意外修改了成員變量
//5,const成員函數(shù)之只能被類對象調(diào)用
void show() const
{
cout << '(' << m_x << ',' << m_y << ')' << endl;
//this->m_x = 90; //error
m_iTestData = 999;
cout << "m_iTestData=" << m_iTestData << endl;
}
private:
float m_x;
float m_y;
static int m_iTestData;
};
int Point::m_iTestData = 90;
int main(void)
{
Point p1(2, 3);
Point p2(5, 7);
p1.show(); //-->Point::show(&p1);
p2.show();
//const point -> common point //errror
//common point -> const point //right
//const int a = 90;
const Point p3(12, 34);
p3.getX();// -->Point::getX(&p3);
return 0;
}
C++的繼承
單繼承
多繼承
虛繼承
class Teacher:virtual public Presion
派生類,會自動在類中添加一個指針里伯,通過指針訪問基類數(shù)據(jù)
在虛繼承情況下城瞎,由最派生類真正繼承被虛繼承的類
被虛繼承的類中的成員的初始化,由最派生類負責初始化
//單繼承
#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
// 繼承方式其實是對繼承過來的成員進行封裝
//2,若沒有指定繼承方式疾瓮,則默認為private繼承
// class Teacher: Person-->class Teacher: private Person
//3,只有一個繼承,稱之為單繼承
//4,將被繼承的類稱之為基類
//5,新產(chǎn)成的類稱之為派生類
//6,派生類需要對繼承過來的數(shù)據(jù)和本身新增成員進行初始化
//7,對繼承過來的成員初始化方式:
// 在派生類構(gòu)造函數(shù)的初始化列表中脖镀,
// 顯式或者隱式的調(diào)用基類的構(gòu)造函數(shù)來對數(shù)據(jù)進行初始化
// 隱式的調(diào)用基類的構(gòu)造函數(shù):默認調(diào)用基類的無參構(gòu)造函數(shù)
//class Teacher: public Person
//class Teacher: protected Person
class Teacher: private Person
{
public:
#if 0
//以下兩種情況:默認調(diào)用基類的無參構(gòu)造函數(shù)
// 對繼承過來的數(shù)據(jù)進行初始化
//即沒有在派生類的初始化列表中寫上基類的構(gòu)造函數(shù)
//則默認調(diào)用基類的無參構(gòu)造函數(shù)對繼承過來的數(shù)據(jù)進行初始化
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;
};
class Teacher: 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: 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
<< " 年級:" << m_strGrade << endl;
}
private:
float m_fMath;
float m_fChinese;
float m_fEnglish;
string m_strGrade;
};
//多繼承情況時,基類構(gòu)造函數(shù)的調(diào)用順序和繼承順序保持一致
//和在初始化列表中的前后順序無關(guān)
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)
{
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;
};
int main(void)
{
GraduateStudent gs("1001", "xhangsan", 19
, 'f', "beijing", 90
, 98, 78, "二年級"
, "c++", 9000, "研究生"
, "機器自主學習");
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;
}
//虛擬繼承
#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;
};
//虛繼承,派生類會自動在類中添加一個指針
//通過該指針來訪問基類數(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
<< " 年級:" << m_strGrade << endl;
}
private:
float m_fMath;
float m_fChinese;
float m_fEnglish;
string m_strGrade;
};
//多繼承情況時狼电,基類構(gòu)造函數(shù)的調(diào)用順序和繼承順序保持一致
//和在初始化列表中的前后順序無關(guān)
//在虛繼承情況下蜒灰,由最派生類來真正繼承被虛繼承的類
//被虛繼承的類中的成員的初始化由最派生類負責
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, "二年級"
, "c++", 9000, "研究生"
, "機器自主學習");
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;
}