先說C++中的類,和結(jié)構(gòu)體的區(qū)別
比如說,結(jié)構(gòu)體中,是不能定義方法的,只能定義指針函數(shù)
在類中,是可以定義方法的,且類中,可以有this,直接指向變身的變量,這個在結(jié)構(gòu)體中,都是不存在的。
構(gòu)造函數(shù)
class Teacher{
? ?private:
? ?char *name;
? ?int age;
? ?public:
//無參構(gòu)造函數(shù)(寫了,就會覆蓋默認(rèn)的無參構(gòu)造函數(shù))
? ?Teacher(){
? ? ? ?cout << "無參構(gòu)造函數(shù)" << endl;
}
//有參構(gòu)造函數(shù)會覆蓋默認(rèn)的構(gòu)造函數(shù)
? ?Teacher(char *name, int age){
? ? ?this->name = name;
? ? ?this->age = age;
? ? cout << "有參構(gòu)造函數(shù)" << endl;
? }
};
void main(){
?Teacher t1;
?Teacher t2("yuehan",20);
//另外一種調(diào)用方式
? Teacher t3 = Teacher("jack",21);
? system("pause");
}
最后打印出的就是,無參,有參,有參
很簡單,跟JAVA其實差不多
析構(gòu)函數(shù)就是作善后處理的函數(shù),如下
class Teacher{
? ?private:
? ?char *name;
? ?int age;
? ?public:
? ?//無參構(gòu)造函數(shù)賦默認(rèn)值
? ?Teacher(){
? ? ? this->name = (char*)malloc(100);
? ? ? strcpy(name,"jack walson");
? ? ? age = 20;
? ? ? cout << "無參構(gòu)造函數(shù)" << endl;
}
//析構(gòu)函數(shù)
//當(dāng)對象要被系統(tǒng)釋放時,析構(gòu)函數(shù)被調(diào)用
//作用:善后處理
~Teacher(){
? ?cout << "析構(gòu)" << endl;
? ?//釋放內(nèi)存
? ?free(this->name);
? ?}
};
void func(){
? ?Teacher t1;
}
void main(){
? ?func();
? ?system("pause");
? ?}
這樣,當(dāng)對象被系統(tǒng)釋放時,析構(gòu)函數(shù)也會被調(diào)用
下面講講拷貝
先看一個例子:
class Teacher {
? ?public:
? ?char *name;
? ?int age;
? ?public:
? ?Teacher(char *name, int age) {
? ? ? ?this->name = name;
? ? ? ?this->age = age;
? ? ? cout << "有參構(gòu)造函數(shù)" << endl;
}
void myprint() {
? ? cout << name << "," << age << endl;
? }
};
void main() {
? ?Teacher t1("rose", 20);
? ? Teacher t2 = t1;
? ? ?t1.name = "yan";
? ? ?t1.myprint();
? ? ?t2.myprint();
? ? ?system("pause");
}
如上直接賦值,在JAVA中,t1,t2打印出來都是一直的,都是會yan。而在此處,只有t1是yan,t2的打印,依然會是rose。所以可以看出,這里的拷貝,是值拷貝,而不是指向指針。其效果等同于下面的寫法:
class Teacher {
public:
char *name;
int age;
public:
Teacher(char *name, int age) {
? ?this->name = name;
? ?this->age = age;
? ?cout << "有參構(gòu)造函數(shù)" << endl;
}
//拷貝構(gòu)造函數(shù)(值拷貝)
//默認(rèn)拷貝構(gòu)造函數(shù),就是值拷貝
Teacher(const Teacher &obj) {
? ?this->name = obj.name;
? ?this->age = obj.age;
? ?cout << "拷貝構(gòu)造函數(shù)" << endl;
}
void myprint() {
? ?cout << name << "," << age << endl;
}
};
可以看出,這里面就重寫了拷貝構(gòu)造函數(shù),其效果,和不寫是一樣的。原因前面說了,這是默認(rèn)就是值拷貝,這里的寫法,也是值拷貝。