C++类与对象(下)

文章目录

  • C++类与对象(下)
  • 前言
  • 一、构造函数的深入
    • 1.初始化列表
    • 2. explicit关键字
  • 二、static成员
  • 三、友元
    • 0.友元
    • 1.友元函数
    • 2.友元类
  • 四、内部类
  • 总结

前言

今天是C++初步认识的最后一篇文章,这三篇文章基本上叙述了C++类与对象的关系,以及它们的作用,定义的方法, 和构成,明天开始我们就开始C++进一步的知识总结

一、构造函数的深入

1.初始化列表

以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
class Date
{public:Date(int year, int month, int day): _year(year),_month(month),_day(day){}private:int _year;int _month;int _day;
};

你问我这有啥用?看着高级啊!但是大家在使用时需要注意一些地方:
1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2.类中包含以下成员(引用成员变量,const成员变量,自定义类型成员(类内没有默认构造函数)),必须放在初始化列表位置进行初始化
3.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。

class Time
{public:Time(int hour = 0):_hour(hour){cout << "Time()" << endl;}
private:int _hour;
};
class Date
{public:Date(int day){}
private:int _day;Time _t;
};
int main()
{Date d(1);
}

这里我们就会先初始化 _t 然后再去初始化_day。

4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关,但是static成员变量会先于其他成员变量初始化

class Time
{public:Time(int hour = 0):_hour(hour){cout << "Time()" << endl;}
private:int _hour;
};
class Date
{public:Date(int day,int d):_day(day),_a1(d),_a2(d){}
private:int _day;int a2;int a1;Time _t;static int c;
};
int Date::c = 10;
int main()
{Date d(1);
}

这里我们就会先初始化 c ,再去 _t ,然后是_day,a2,a1。

2. explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。

class Date
{public:Date(int year):_year(year){}explicit Date(int year):_year(year){}private:int _year;int _month:int _day;
};
void TestDate()
{Date d1(2018);// 用一个整形变量给日期类型对象赋值// 实际编译器背后会用2019构造一个无名对象,最后用无名对象给d1对象进行赋值//d1 = A(2018);  用无名临时对象对d1对象进行拷贝构造赋值。
}

二、static成员

概念:
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化!!

特性:
1.静态成员为所有类对象所共享,不属于某个具体的实例
2.静态成员变量必须在类外定义,定义时不添加static关键字
3.类静态成员即可用类名 :: 静态成员或者对象.静态成员来访问 (重点!!重点!!重点!!)

class Date
{public:static Show(){cout<<d1.a<<" "<<d1.b<<endl;}
private:int a = 10;int b = 10;
};
int main()
{Date d1;Date::Show();
}

4.静态成员函数没有隐藏的this指针,不能访问任何非静态成员*(重点!!!)*
5.静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

三、友元

0.友元

友元分为:友元函数友元类
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度破坏了封装,所以友元不宜多用

1.友元函数

问题:
现在我们尝试去重载operator<<,然后发现我们没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以我们要将operator<<重载成全局函数。但是这样的话,又会导致类外没办法访问成员,那么这里就需要友元来解决。operator>>同理。

class Date
{public:Date(int year, int month, int day): _year(year),_month(month),_day(day){}//ostream& operator<<(ostream& _cout)//{//   _cout<<d._year<<"-"<<d._month<<"-"<<d._day;//    return _cout;//}//但是这里我们知道,类内成员函数,处过静态和友元,第一个参数永远是那个隐藏了的this的指针。//正确的写法如下:friend ostream& operator<<(ostream& _cout, const Date& d);
prvate:int _year;int _month;int _day
};
/*友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声
明,声明时需要加friend关键字*/ostream& operator<<(ostream& _cout, const Date& d)
{_cout<<d._year<<"-"<<d._month<<"-"<<d._day;return _cout;
}
int main()
{Date d(2017, 12, 24);d<<cout;return 0;
}

友元函数可以直接访问类的私有成员,它是定义在类外部普通函数不属于任何类,但需要在类的内部声明,声明时需要加friend关键字

注意点:
1.友元函数可访问类的私有和保护成员,但不是类的成员函数
2.友元函数不能用const修饰
3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制
4.一个函数可以是多个类的友元函数
5.友元函数的调用与普通函数的调用和原理相同

2.友元类

特性:
1.友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
2.友元关系是单向的,不具有交换性。
比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time
类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
3.友元关系不能传递
如果B是A的友元,C是B的友元,则不能说明C时A的友元。

class Date; // 前置声明
class Time
{friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量
public:Time(int hour, int minute, int second): _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;
};

四、内部类

概念:
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

咱们简而言之,外部类就是内部类的舔狗,把自己的东西可以给它,但是内部类不理这个舔狗,所以外部类不能访问内部类的任何成员,就是舔狗奉献了自己的一切,最后一无所有。
特性:
1.内部类可以定义在外部类的public、protected、private都是可以的。
2.内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。
3.sizeof(外部类)=外部类,和内部类没有任何关系。

class A
{private:static int k;int h = 0;
public:class B{public:void foo(const A& a){cout << k << endl;//OKcout << a.h << endl;//OK}};
};
int A::k = 1;
int main()
{A::B b;b.foo(A());return 0;
}

这里我们看到,内部类 B类 的 对象b 通过自身函数访问了 A类 的成员,直接把 A类 的老底都掏了,这就是内部类的特性。

总结

这里我们结束了C++的入门学习,了解了C++的基础内容,明天开始我们将学习C++自己的特性功能。希望今天的知识点总结对大家有帮助。

C++类与对象(下)相关推荐

  1. C++(四)——类和对象(下)

    this指针的用途 #include<iostream> using namespace std; //解决名称冲突//返回对象本身 *this class Person { public ...

  2. java中如何把时间封装成类,java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象?...

    java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象? 我想将date1格式的日期转换为date2格式的日期对象. SimpleDateFormat simple ...

  3. 【Java程序设计】类与对象的基本概念(下)

    类与对象的基本概念(下) 文章目录 类与对象的基本概念(下) 一.类的访问权限控制 1.访问控制修饰符 (1)默认访问修饰符-不使用任何关键字 (2)私有访问修饰符-private (3)受保护的访问 ...

  4. javaSE探赜索隐之三--<类与对象的爱恨情仇下>

    封装 封装就是将类的某些信息隐藏在类的内部,不允许外部直接访问.而是通过该类提供的方法对隐藏的信息进行访问. public class Person {//隐藏类的信息,这样外部就不能访问privat ...

  5. C++类和对象 (下)

    作者:@小萌新 专栏:@C++初阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客目标:梳理类和对象剩下几个零碎的知识点 专注是一种能力 类和对象 本章目标 一. 输入输出流 1.1 流概念 1 ...

  6. cpp初阶--Lesson 04 类和对象(下)

    Lesson 04 类和对象(下) [本节目标] 1. 再谈构造函数 2. C++11 的成员初始化新玩法. 3. 友元 4. static成员 5. 内部类 6. 再次理解封装 虽然构造函数调用之后 ...

  7. 类和对象(下)(一)

    类和对象(下)(一) 1.再谈构造函数 1.1构造函数体赋值 1.2初始化列表 1.3explicit关键字 2.static成员 2.1概念 2.2特性 3.匿名对象

  8. 对Spring Data JPA中的page对象下的content属性里的实体类对象转换为dto对象

    对Spring Data JPA中的page对象下的content属性里的实体类对象转换为dto对象. 刚开始试遍历content,进行转换,添加到新的list中,再set进去page.后来发现pag ...

  9. 冰冰学习笔记:类与对象(下)

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

最新文章

  1. 十大经典排序算法Python版实现(附动图演示)
  2. javascript this指针详解
  3. VC检测OLE控件是否已经注册,并注册它
  4. RHEL7OSP-6.0的openstack云主机发放
  5. c语言编程切片stl1005无标题,C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码...
  6. 树状数组求区间和(区间均值)
  7. 555定时器,你知道它的功能有多强大吗?
  8. sulime text 常用快捷键总结
  9. 【转】QTableView 小结
  10. 微博爬虫 ----- 微博发布时间清洗
  11. C# aspx 数据绑定集中(待修改)
  12. 垂直的SeekBar:VerticalSeekBar
  13. 深入理解PSNR(峰值信噪比)(附matlab代码)
  14. paypal接口文档android,PAYPAL --集成API接口教程
  15. WPBeginner年满10岁-反思,更新和WordPress赠品(奖金124,000美元以上)
  16. Error starting userland proxy: listen tcp 0.0.0.0:xxx端口: bind: address already in use解决办法
  17. JAVA就业培训班一周有感杂记
  18. LeetCode207: 课程表(字节手撕算法拓扑排序)
  19. 需不需要上线MES系统,你在纠结什么?
  20. 如何看待人生与技术的价值

热门文章

  1. 对状压dp的一点理解
  2. git push问题 objects/pack/tmp_pack_XXXXXX': Permission denied
  3. 2022-2027年中国食用甜味剂行业市场全景评估及发展战略规划报告
  4. Qt版连连看之极速连连看:界面设计(一)QSS更换主题
  5. 小白看大型网站架构设计方案
  6. JS破解初探,折腾到头秃的美拍视频Python采集下载
  7. 足球走地大小球量化分析方法软件
  8. 游戏配音为游戏增色,这些技巧少不了
  9. 人生最大的敌人是自己
  10. 过控专业转计算机好转吗,过程装备与控制工程专业的现状及未来趋势分析