当前位置: 首页 > news >正文

类和对象(下)

再谈构造函数

在类和对象(中)的时候我们已经大致的的了解了一点构造函数,但时的话构造函数在构造的时候有两种:
在这里插入图片描述
在前面我们已经重点讲解过构造函数赋值,现在重点放在初始化列表就好

构造函数赋值

在编辑对象时,给对象中各个成员变量一个合适的初始化

初始化列表

初始化列表格式:

class date
{
public://初始化列表格式date(int year,int month,int day)  //初始化列表名和类名相同:_year(year)           //()_year会初始化为(year),_month(month),_day(day){}
private:int  _year;int _month;int _day;
};

需要注意的是:

1.每个成员函数在初始化列表中只出现一次
2.以下3类成员变量必须在初始化列表初始化:
— a.引用成员函数
—b.const成员变量
—c.自定义类型成员(该类没有默认构造函数时)

class date
{
public://初始化列表格式date(int year,int month,int day,int n,int ref)  //初始化列表名和类名相同:_year(year)           //()_year会初始化为(year),_month(month),_day(day),_n(n)             //必须使用初始化列表初始化,_ref(ref)         //必须使用初始化列表初始化{}
private:int  _year;int _month;int _day;const int _n;int& _ref;
};

在这里有两个小知识点:

1.对于自定义类型来说,一定会先使用初始化列表进行初始化。
2.真正的初始化顺序 = 成员变量在类中声明的顺序。而不是初始化列表顺序
如:
#include <iostream>
using namespace std;class A {
public:A() { cout << "A构造\n"; }
};class B {
public:B() { cout << "B构造\n"; }
};class C {B b;A a;
public:C() : a(), b() {}  // 初始化列表中先写 a,再写 b
};

static成员

static是声明的是静态成员,在内存中的存储位置在静态区,类中用static修饰后的成员变量叫做,静态成员变量。修饰的成员函数叫作静态成员函数。静态成员变量必须在类外进行定义,静态成员函数没有this指针。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>class date
{
public:date(int a, int b){_a = a;_b = b;}static int& Add(int a, int b)  //静态成员函数{int c = a + b;return c;}private:static int _day;int _a;int _b;};int date::_day = 365;   //在类外进行静态成员变量的定义int main()
{//静态成员函数的使用int total=date::Add(3,5);  //使用::访问类中静态成员函数return 0;
}

特性:

1.静态成员为所有类和对象共享,不属于某个类;
2.静态成员变量必须在类外定义,定义时不需要加static,类中只是声明;
3.静态成员函数没有隐藏的this指针;
4.静态成员函数也是类的成员,同样受public,protected,private的限制
5.非静态成员函数可以调用静态成员函数,但是反过来不行;

友元

看一下代码:

class date
{
public:date(int year, int month, int day)  //构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};int main()
{date a(2025,4,26);cout<<a<<endl;return 0;
}

我们看一下,上面这一串代码能不能使用cout<<a<<endl;进行打印?
答案是不行的
在这里插入图片描述
标准库中没有为该类型定义 operator<< 重载(流插入运算符)
这个时候我们就得自己实现:
1. operator<<重载函数不能写在类中,因为写在类中会有this指针,使得调用 << 只能a<<cout,可以编译但是不符合流插入的使用逻辑。
那我们这么办?答案时函数写在类外面,但是在类外要这么访问对象呢?这个时候就需要使用友元函数(friend)

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class date
{
public:friend std::ostream& operator<<(ostream& _cout, date a); //友元函数的声明date(int year, int month, int day)  //构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};std::ostream& operator<<(ostream& _cout, date a) //定义友元函数
{_cout << a._year << a._month << a._day << endl;return _cout;
}int main()
{date a(2025, 4, 26);cout << a << endl;return 0;
}

在这里插入图片描述
注意:

1.友元函数可以在类的任意地方声明,不受访问限制符限制;
2.友元函数调用和普通函数原理相同;
http://www.xdnf.cn/news/163477.html

相关文章:

  • 综述类论文读后报告——重庆大学《深度学习在人类活动识别中的应用综述》
  • 16. LangChain自主智能体(Autonomous Agent):模拟人类工作流的进阶设计
  • 4.26-count部分的渲染
  • 参考平面的宽度-信号与电源完整性分析
  • 云原生--核心组件-容器篇-3-Docker核心之-镜像
  • 考研系列-计算机组成原理第四章、指令系统
  • 012组合数学——算法备赛
  • [创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论
  • 前端职业发展:如何规划前端工程师的成长路径?
  • RAG技术解析:以Text2SQL为例看检索增强生成的全流程应用
  • 第1章 基础知识
  • brew 安装openjdk查看其版本
  • 一文了解TOGAF 认证考试,如何选择科目?
  • ROS 快速入门教程05
  • 如何保证线程安全(含典型手段与应用场景)
  • Maven插件下载失败?三步解决SSL握手错误与镜像配置
  • 【蓝桥杯省赛真题56】Scratch抓不住的蜜蜂 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
  • 72.评论日记
  • CMCC RAX3000M CH EC 算力版刷机(中国移动 RAX3000M 算力版)刷机
  • 大模型的使用
  • 2025年暨南大学 ACM校赛分析与题解
  • 二、UI自动化测试02--元素定位方法
  • 【赵渝强老师】快速上手TiDB数据库
  • 线程池(四):并发编程常见问题解析
  • java基础之枚举和注解
  • NdrpConformantVaryingArrayUnmarshall函数分析--重要
  • 【家政平台开发(79)】解锁家政新金融:家政平台与金融服务融合之道
  • 基于大模型的急性肠套叠全流程预测与诊疗方案研究报告
  • Java 变量入门指南
  • 什么是WebSocket?NGINX如何支持WebSocket协议?