类对象定义 三
類對象定義(二)
淺拷貝
淺拷貝:拷貝后,兩個對象會共同指向一個地址,如果有一個對象更改了數據,另一個對象也會受影響,刪除對象話,可能會導致釋放兩次
using namespace std; //.h class student { public:student();student(string name);student(const student &stu);~student();string getName();int age; private:string m_name; };//cpp 這叫定義 student::student() {m_name="kitty";m_p=new int[5];cout<<"gou zao"<<endl; } string student::getName(){return m_name; } student::student(string name) {m_name=name; } //拷貝構造函數 (淺拷貝) student::student(const student &stu) { // 如果通過 student stu1=stu 這樣的方式創建度對象,會執行拷貝構造函數m_name=stu.m_name; //淺拷貝m_p=stu.m_p;//淺拷貝 將復制的對象的 指針拷貝給了 另一個對象, 現在兩個對象 共同指向了一個 地址cout<<"qian kaobei"<<endl; } student::~student() {delete []m_p; //這樣刪除的話,淺拷貝會出問題cout<<"xi gou"<<endl; } void student::printAddr() {cout<<"dizhi:"<<*m_p<<endl; } void test(student s){} int main() {student s;student s1(s);s.printAddr();s1.printAddr();return 0; } 復制代碼深拷貝
using namespace std; //.h class student { public:student();student(string name);student(const student &stu);~student();string getName();void printAddr(); private:int count;string m_name;int *m_p; };//cpp 這叫定義 student::student() {m_name="kitty";count=5;m_p=new int[count]; //初始化數組for (int i = 0; i < 5; i++) {//數組賦值m_p[i]=i;cout<<"value:"<<m_p[i]<<endl;}cout<<"gou zao"<<endl; } string student::getName(){return m_name; } student::student(string name) {m_name=name; } //拷貝構造函數 (深拷貝) student::student(const student &stu) {count=stu.count;//深拷貝 重新開辟一塊內存空間m_p=new int [count];for (int i = 0; i <count; i++){m_p[i]=stu.m_p[i];}cout<<"shen kaobei"<<endl; } student::~student() {delete []m_p;cout<<"xi gou"<<endl; } void student::printAddr() {cout<<"dizhi:"<<m_p<<endl; }void test(student s){} int main() {student s;student s1(s);s.printAddr();s1.printAddr();return 0; }復制代碼對象指針
int main() {student *s=new student();s->printAddr();student *s1=new student();(*s1).printAddr();return 0; } 復制代碼對象成員指針
對象成員指針 類似JAVA中的 對象屬性
例如:private Bean bean;
指針類型大小為:4
using namespace std;class Teacher { public:Teacher(string name, int age);~Teacher();string getName();int getAge();private:string m_Name;int m_Age; };//.h class Student { public:Student(string nameA, int ageA, string nameB , int ageB);~Student();void printInfo();private:Teacher *m_teacherA;Teacher *m_teacherB; };Teacher::Teacher(string name, int age) {m_Name = name;m_Age = age;cout << "Teacher gou zao name: " << m_Name << " age: " << m_Age << endl; }Teacher::~Teacher() {cout << "Teacher xi gou name: " << m_Name << " age: " << m_Age << endl; }int Teacher::getAge() {return m_Age; }string Teacher::getName() {return m_Name; }//cpp 這叫定義 Student::Student(string nameA, int ageA, string nameB , int ageB) {m_teacherA=new Teacher(nameA,ageA);m_teacherB=new Teacher(nameB,ageB);cout << "Student gou zao" << endl; }Student::~Student() {delete m_teacherA;delete m_teacherB;cout << "Student xi gou" << endl; } void Student::printInfo() {cout << "printInfo" << endl;cout << "( A: " <<m_teacherA->getName()<<","<<m_teacherA->getAge()<<")"<< endl;cout << "( B: " <<m_teacherB->getName()<<","<<m_teacherB->getAge()<<")"<< endl; }int main() {Student *s=new Student("kitty",20,"tony",22);(*s).printInfo();cout<< sizeof(s)<<endl;cout<< sizeof(Student)<<endl;delete s;return 0; }復制代碼輸出結果: Teacher gou zao name: kitty age: 20 Teacher gou zao name: tony age: 22 Student gou zao printInfo ( A: kitty,20) ( B: tony,22) 4 8 Teacher xi gou name: kitty age: 20 Teacher xi gou name: tony age: 22 Student xi gou 復制代碼this 指針
和JAVA中的this指針差不多一個意思
總結
- 上一篇: 记一例 ORA-00904:标识符无效
- 下一篇: 论文阅读笔记三十三:Feature Py