C++——类与对象(下)

        在类与对象的上和中已经把类与对象的大部分内容讲了,这里对最后的一些内容进行补充说明。

目录

        一、初始化列表

        二、类型转换

        三、static成员

        四、友元

        五、内部类

        六、匿名对象


        一、初始化列表

        之前我们在实现构造函数的时候,初始化成员变量主要是使用函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。每个成员变量在初始化列表中只能出现一次,从语法上来看,初始化列表是成员变量定义初始化的地方。

        引用成员变量const成员变量没有默认构造的类类型变量必须放在初始化列表的中进行初始化。C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤的。

        初始化列表中按照成员变量在类中声明顺序进⾏初始化,跟成员在初始化列表出现的的先后顺序⽆关。建议声明顺序和初始化列表顺序保持⼀致。对于没有显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构造会编译错误。

#include<iostream>
using namespace std;class Date
{
public:Date(int year=1949, int month=10, int day=1)//成员变量的定义初始化:_year(year)/*,_month(month),_day(day)*/{}void Print(){cout << _year << "/" << _month << "/" << _day <<  endl;}
private://成员变量的声明//当初始化列表中没有对参数进行初始化时 就会用这里的默认值对形参进行初始化int _year;int _month=2;int _day=2;
};int main()
{//这里只给第一个参数进行了传参 后面两个参数会采用设置的默认值//但是我们在初始化列表的位置并没有对_month和_day进行初始化//所以用的是变量声明位置的缺省值对变量进行初始化 打印的结果为1949/2/2Date d1(1949);d1.Print();return 0;
}

        二、类型转换

        C++⽀持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数,在构造函数前⾯加explicit就不再⽀持隐式类型转换。

#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1):_year(year),_month(month),_day(day){}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{//这里隐藏了一个类型转化 编译器先用1949构造了一个临时对象 再用这个临时对象拷贝构造了d1//(Date)1Date d1=1949;d1.Print();//当有多个参数的时候要用{}Date d2 = { 2001,10,1 };d2.Print();return 0;
}

        三、static成员

        用static修饰的成员变量被称为静态成员变量,静态成员变量要在类外进行初始化。静态成员变量不属于某个对象,它是这个类实例化出的所有对象共享的,所以它不存在对象中,存放在静态区中。 

        用static修饰成成员函数被称为静态成员函数,静态成员函数没有this指针。静态成员函数中可以访问其他的静态成员,因为没有this指针,所以不能访问非静态成员变量。非静态成员函数可以访问任意的静态成员变量和静态成员函数。

        可以通过类名::静态成员 或者 对象.静态成员 来访问静态成员变量和静态成员函数。

        静态成员也是类的成员,受public、protected、private 访问限定符的限制。静态成员变量不能再声明位置给定缺省值,因为声明部分的缺省值是用于构造函数初始化列表的,静态成员变量不属于对象,不能用构造函数初始化列表来初始化。

#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){//非静态成员函数可以调用任意的静态成员变量和静态成员函数++_count;}//静态成员函数可以调用静态成员变量static int GetCount(){return _count;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;static int _count;
};//初始化时要加上作用域运算符 这里可以用来统计实例化出了多少个对象
int Date::_count = 0;int main()
{Date d1 = 1949;d1.Print();Date d2 = { 2001,10,1 };d2.Print();//两个值输出时都是2 static定义的静态成员变量是所有类对象共享的cout << "d1 count=" << d1.GetCount() << endl;cout << "d2 count=" << d2.GetCount() << endl;return 0;
}

        四、友元

        在一些特殊的情况,我们会在类外需要访问类内private或者protected修饰的成员变量或成员函数,这个时候我们就可以用到友元。友元分为:友元函数和友元类,在函数声明或者类声明的前面加上friend,并且把友元声明放到一个类里面。友元函数只是一种声明方式,并不是一个类的成员函数。友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。一个函数可以是多个类的友元函数。友元类中的成员函数都可以看作是另外一个类的友元函数,都可以访问另外一个类中的私有和保护成员。

        友元类的关系是单向的,它不具有交换性和传递性。比如说A类是B类的友元,但是B并不是A的友元;如果A类是B类的友元,B类是C类的友元,但是A类并不是C类的友元。

#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){	}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}//友元函数在声明的时候形参部分可以只写参数类型friend void Modify(Date&);
private:int _year;int _month;int _day;
};
//函数在外部定义 要去掉friend 这个时候就可以直接访问类内的私有和保护成员了
void Modify(Date& d)
{d._year = 1;d._month = 1;d._day = 1;
}int main()
{Date d1(2000,10,10);d1.Print();Modify(d1);//这里就成功的修改了类内的私有成员d1.Print();return 0;
}

        五、内部类

        如果一个类定义在另外一个类的内部,这个内部定义的类就叫做内部类。内部类是一个独立的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。也就是说如果一个类中定义了一个内部类,那么在计算机这个类的大小时,并不会因为有这个内部类而发生改变,内部的这个类除了类域和访问权限受到限制,其他和定义在全部的类是一样的。同时内部类默认时外部类的友元类。

        六、匿名对象

        ⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象。匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mupdf 编译说明

进入官网下载源码&#xff1a;https://www.mupdf.com/releases 挑选需要的版本&#xff0c;下载解压&#xff0c;然后打开解决方案&#xff0c;进行编译

python 怎样生成窗体

通过import tkinter导入Tkinter模块&#xff0c;没有这句下面的都不成立了。 wintkinter.Tk()&#xff0c;这句是创建windows的窗口对象&#xff0c;注意后面的Tk&#xff0c;大小写。 win.title("窗口")&#xff0c;这段是设置窗口上的标题。 另外窗口的大小你可以通…

Linux操作系统特殊权限、文件系统管理命令、网络配置命令

Linux操作系统特殊权限 在Linux操作系统中&#xff0c;除了常规的读、写、执行权限外&#xff0c;还有一些特殊权限用于控制文件和目录的访问行为。这些特殊权限包括SUID&#xff08;Set User ID&#xff09;、SGID&#xff08;Set Group ID&#xff09;和Sticky Bit&#xff…

LlamaIndex 结构化输出

我们和大模型是通过 prompt 进行交互的&#xff0c;我们提示什么&#xff0c;大模型就输出什么。 假如我们要求大模型输出结构化的数据如 JSON&#xff0c;yaml 是不是也可以&#xff1f; 第一个例子 先建一个索引&#xff1a; from llama_index.core import VectorStoreIn…

java实战项目-学生管理系统(附带全套源代码)--《基础篇》

一、前言 第一个java小型学生管理系统&#xff0c;思路和其他语言都一样&#xff0c;因为有C语言的基础&#xff0c;写这个并不是太难&#xff0c;不过&#xff0c;进阶篇的就难太多了。明天晚上更新进阶篇&#xff0c;因为目前代码还没有完善&#xff0c;保守估计需要500行代…

网络请求优化:如何让你的API飞起来

网络请求优化&#xff1a;如何让你的API飞起来 亲爱的开发者朋友们&#xff0c;你是否曾经遇到过这样的场景:用户疯狂点击刷新按钮,你的服务器却像老年人散步一样慢吞吞地响应。或者,你的应用像个贪吃蛇,疯狂吞噬用户的流量包。如果你对这些情况再熟悉不过,那么恭喜你,你正需要…

Unity ColorSpace 之 【颜色空间】相关说明,以及【Linear】颜色校正 【Gamma】的简单整理

Unity ColorSpace 之 【颜色空间】相关说明&#xff0c;以及【Linear】颜色校正 【Gamma】的简单整理 目录 Unity ColorSpace 之 【颜色空间】相关说明&#xff0c;以及【Linear】颜色校正 【Gamma】的简单整理 一、简单介绍 二、在Unity中设置颜色空间 三、Unity中的Gamma…

部队物资仓库出入库管理系统|实现物资有效的战备保障

随着科技的不断发展&#xff0c;智慧营区已成为现代军事管理的重要方向。后勤物资管控作为营区管理的重要组成部分&#xff0c;对于保障营区正常运转和提高部队战斗力具有重要意义。智慧营区后勤物资管控平台作为数字化后勤建设的重要组成部分&#xff0c;能够实现营区物资的智…

Ubuntu下载安装chrome浏览器

方法一&#xff1a;wget下载并安装 1、创建文件夹存安装包 cd /root/Downloads mkdir chrome 2、下载安装包到文件夹内 wget -c https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -P /root/Downloads/chrome 3、安装 cd chrome sudo dpkg -i go…

药品类别功能助力智慧校园医务管理向前迈进

在智慧校园的医务管理框架下&#xff0c;药品类别管理模块发挥着举足轻重的作用&#xff0c;它以智能化的方式优化药品的存储、分配流程&#xff0c;确保每一步都符合安全与效率的标准。这一功能围绕着科学分类的核心理念&#xff0c;细致入微地组织药品信息&#xff0c;为校园…

力扣1963.使字符串平衡的最小交换次数

力扣1963.使字符串平衡的最小交换次数 把所有匹配的消了 剩下的一定是k个‘ [ ’和k个‘ ] ’的组合k为偶数 则res k / 2;k为奇数 则res (k-1)/2 1; class Solution {public:int minSwaps(string s) {int cnt0;for(char c:s){if(c ]){if(cnt > 0) cnt--;}elsecnt;}co…

TCP传输控制协议二

TCP 是 TCP/IP 模型中的传输层一个最核心的协议&#xff0c;不仅如此&#xff0c;在整个 4 层模型中&#xff0c;它都是核心的协议&#xff0c;要不然模型怎么会叫做 TCP/IP 模型呢。 它向下使用网络层的 IP 协议&#xff0c;向上为 FTP、SMTP、POP3、SSH、Telnet、HTTP 等应用…

威纶通触摸屏连接MySQL数据库步骤

目录 概要威纶通支持数据库的触摸屏类型测试Step 1 选择触摸屏型号Step 2 新增数据库服务器Step 3 添加SQL数据库查询功能Step 4 仿真测试 概要 通过使用威纶通带数据库类型的触摸屏&#xff0c;实现连接本地/远程MySQL数据库&#xff0c;并实现数据查询功能 威纶通支持数据库…

Datawhale AI 夏令营_基于术语词典干预的机器翻译挑战赛 .md

基于术语词典干预的机器翻译 在baseline的基础上添加了soft attention&#xff0c;当N2000时&#xff0c;没有问题&#xff0c;但是一旦增加数据量就会爆显存&#xff0c;还需要找一下问题 完整代码如下 from typing import Listimport torch import torch.nn as nn import …

使用harbor作为chart仓库实现内网部署

使用harbor作为chart仓库实现内网部署 制作好的chart包可以传到chart仓库进行共享&#xff0c;chart仓库可以是公有仓库或者使用Harbor搭建的私有仓库。 本文使用的环境信息&#xff1a; rootmaster1:~# kubectl get node NAME STATUS ROLES AGE VERSION…

react antd table拖拽

下载node包 npm install react-resizable -D npm install types/react-resizable --save-dev 定义一个公用组建 ResizableTable.tsx import { useEffect, useState } from "react"; import { Resizable } from "react-resizable"; import "./resize.s…

使用Python + Scrapy + Django构建企业级爬虫平台

引言 在大数据时代&#xff0c;信息就是力量。对于企业而言&#xff0c;掌握行业动态、竞品分析、市场趋势等关键数据&#xff0c;是决策制定的重要依据。然而&#xff0c;手动收集这些信息既费时又低效。因此&#xff0c;自动化数据采集变得至关重要。本文将向你展示如何使用…

专业条码二维码扫描设备和手机二维码扫描软件的区别?

条码二维码技术已广泛应用于我们的日常生活中&#xff0c;从超市结账到公交出行&#xff0c;再到各类活动的入场验证&#xff0c;条码二维码的便捷性不言而喻&#xff0c;而在条码二维码的扫描识别读取过程中&#xff0c;专业扫描读取设备和手机二维码扫描软件成为了两大主要工…

- vuex路由:

vuex vue的状态管理工具(状态就是数据的管理仓库 话语中级语法modules是vuex的高级用法。 react---redux(状态管理工具) vue2--vuex vue3--pinia(小菠萝) 核心概念(是有五个): 1.state:--存放数据 2.getters:计算属性的&#xff0c;通过筛选数组中大于2的&#xff0c;需要…

MySQL表操作(增删改查)

添加字段 ALTER TABLE 表名 ADD 字段名字 类型&#xff08;长度&#xff09;[COMMENT 注释] [自己给当前字段注释命名];修改字段 &#xff08;1&#xff09;仅仅修改指定字段的一些属性&#xff0c;不能重命名 ALTER TABLE 表名 字段名 新数据类型&#xff08;长度);&#x…