C++必修:类与对象(三)
✨✨ 欢迎大家来到贝蒂大讲堂✨✨
🎈🎈养成好习惯,先赞后看哦~🎈🎈
所属专栏:C++学习
贝蒂的主页:Betty’s blog
1. 隐式类型转换
在学习C语言时我们就明白,当我们进行赋值时,如果赋值两边的类型不同时就可能发生隐式类型转换。
1.1. 内置类型
在发生隐式类型转换时,如果都是内置类型就会先开辟一个临时变量,再将右操作数强制类型转换为左操作数的类型,最后用这个临时变量对左操作数进行赋值。注意:这个临时变量具有常性,不可修改。
int main() { double j = 1.1; int i = j;//隐式类型转换 int& a = j;//error const int& b = j;//ok return 0; }
因为临时变量具有常性,所以无法被修改。如果赋值给普通引用就会造成权限的放大,所以只能用常引用。
1.2. 自定义类型
如果将一个内置赋值给自定义类型,那么编译器也会先创造一个自定义类型的**临时变量,**然后用这个内置类型调用构造函数对临时变量初始化,最后用这个临时变量对左操作数进行拷贝构造。。注意:这个临时变量也具有常性,不可修改。
class Date { public: Date(int year = 1, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } void Print() { cout Date d1 = 2023;//发生隐式类型转换 Date d2 = { 2023,2 }; d1.Print(); d2.Print(); return 0; } public: explicit Date(int year = 1, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } void Print() { cout Date d1 = 2023;//发生隐式类型转换 Date d2 = { 2023,2 }; d1.Print(); d2.Print(); return 0; } public: static int Print()//静态成员函数 { cout public: static void Print()//静态成员函数 { cout A a; a.Print(); A::Print(); return 0; } cout return x + y; } cout return x + y; Print(); } friend void Print(const Date& d);//友元函数 public: Date(int year = 1, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } private: int _year; int _month; int _day; }; void Print(const Date&d) { cout public: Date(int year = 1, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } int GetYear()const { return _year; } int GetMonth()const { return _month; } int GetDay()const { return _day; } private: int _year; int _month; int _day; }; void Print(const Date& d) { cout friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类 public: Time(int hour = 0, int minute = 0, int second = 0) : _hour(hour) , _minute(minute) , _second(second) {} private: int _hour; int _minute; int _second; }; class Date { public: Date(int year = 1900, int month = 1, int day = 1) : _year(year) , _month(month) , _day(day) {} void SetTimeOfDate(int hour, int minute, int second) { // 直接访问时间类私有的成员变量 _t._hour = hour; _t._minute = minute; _t._second = second; } private: int _year; int _month; int _day; Time _t; }; public: class B//B是A的友元 { private: int _m; }; private: int _a; int _b; }; private: static int k; int h; public: class B // B天生就是A的友元 { public: void foo() { cout A::B b; b.foo(); return 0; } private: int k; int h; public: class B // B天生就是A的友元 { public: int _a; }; }; int main() { A a; cout public: Date(int year = 1, int month = 1, int day = 1) { cout cout cout cout Date();//匿名对象 Date d; return 0; } const Date& dc = Date();//匿名对象也具有常性 Date d; return 0; } public: Date(int year = 1, int month = 1, int day = 1) { cout cout cout cout int months[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int day = months[month]; if (month == 2 && (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { day++; } return day; } assert(month 0 && month
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!