ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C++学习日记 Day7:类对象作为类成员+友元

C++学习日记 Day7:类对象作为类成员+友元 ## 今天学了什么今天学习C类对象作为类成员语法、类和对象-友元。## 类对象作为类成员在C中类中的成员可以是另一个类的对象在构造时会先构造其他类对象再构造类自身析构顺序则相反。验证打开VIsio studio2022分别创建两个类Person、Phone将Phone类对象作为Person类的成员变量#include iostream using namespace std; #includestring class Phone { public: Phone(string name) { string p_name name; cout Phone 类构造函数 endl; } ~Phone() { cout Phone 类析构函数 endl; } string p_name; }; class Person { public: Person(string name, string phonename):M_name(name), M_phone(phonename) { cout Person 类构造函数 endl; } ~Person() { cout Person 类析构函数 endl; } string M_name; Phone M_phone; }; void test() { Person p(张三,苹果); cout p.M_name 拿着 p.M_phone.p_name 手机 endl; } int main() { test(); return 0; }在test下一个断点进入调试观察发现首先进入的是Phone的构造函数然后进入Person类的构造函数之后在析构时先进入Person的析构函数后进入Phone的析构。*发现如果自己写了有参构造{}里面赋值不写无参构造在创建对象时会出现错误。原因在有参构造情况下编译器不再自动生成无参构造如果类B里面包含另一个类A实体对象创建B的对象时会优先初始化B里面的所有成员再执行B的构造函数{}里的代码。编译器初始化实体对象时会自动调用A的无参构造函数若A写了有参构造没有无参构造编译器找不到A的无参构造就会报错。解决办法手写初始化列表让编译器知道使用A的有参构造。任何构造函数一定存在初始化列表自己不写编译器会帮你隐式生成默认对成员做无参初始化## 友元定义让一个函数或者类访问另一个类中的私有成员。关键字friend三种实现方式全局函数做友元class Personbuild { friend void visitbuild(Personbuild visit); public: Personbuild() { house 客厅; bedroom 卧室; } string house; private: string bedroom; }; void visitbuild(Personbuild visit) { visit.bedroom 厨房; cout 全局函数正在访问 visit.bedroom endl; } test() { Personbuild p; visitbuild(p); }如果不写 friend void visitbuild(Personbuild visit); visitbuild 只能访问 house 不能访问 bedroom 。断点调试无法观察出具体实现步骤在 visitbuild 中尝试改变 Personbuild 的私有成员变量 bedroom进入调试发现在执行这一行代码以后bedroom的值发生改变。类做友元class Personbuild { friend class visiter; public : Personbuild() { house 客厅; bedroom 卧室; } string house; private: string bedroom; }; class visiter { public: void visit() { Personbuild pd; cout visiter类正在访问 pd.house endl; cout visiter类正在访问 pd.bedroom endl; } }; void test() { visiter vs; vs.visit(); }加入 friend class visiter; 实现访问私有成员。成员函数做友元class building; class visiter { public: visiter(); void visit1(); void visit2(); building* build; //building building2; }; class building { friend void visiter::visit2(); public: building() { house 客厅; bedroom 卧室; } string house; private: string bedroom; }; visiter::visiter() { build new building; } void visiter::visit1() { cout 通过指针visit1访问 build-house endl; //cout visit1访问 building2.house endl; } void visiter::visit2() { cout visit2访问 build-bedroom endl; } void test() { visiter vs; vs.visit1(); vs.visit2(); }加入 friend void visiter::visit2(); 实现访问私有成员。*注类A的成员函数类B的做友元代码步骤①前向声明类B②定义类A类内只写函数声明不写函数体实现类内定义B类型成员只能用指针定义不能定义实体对象。③定义类B在内部写友元声明函数体实现也可以写在类外④在B类定义下方写A成员函数的实现⑤创建对象调用函数。## 思考** 在C中传递自定义类传递类型的使用时机 **答在C中传递自定义类如果需要只读优先使用const引用需要修改用引用没有具体实例、需要判空用指针自定义类很少用值传递原因1.开销较大2.如果类里有指针但没写深拷贝构造函数值传递会触发浅拷贝析构时双重释放程序崩溃。
返回列表