从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元

前言

本系列文章承接C语言的学习,需要++有C语言的基础++ 才能学会哦~

第7篇主要讲的是有关于C++的++取地址运算符重载++ 、++类型转换++ 、++static成员++ 和++友元++ 。
C++才起步,都很简单

目录

前言

取地址运算符重载

const成员函数

基本语法

特点

取地址运算符重载

类型转换

static成员

友元

特点


取地址运算符重载

const成员函数

tips:const只有在修饰指向内容的时候,才设计权限的放大和缩小的问题。

基本语法

cpp 复制代码
//无const,传入参数为Date* const this,不可修改this指针本身
void Print() 
{
    cout << _year << "-" << _month << "-" <<_day;
}

//有const,传入参数为const Date* const this,不可修改this指针和其指向的内容
void Print() const
{
    cout << _year << "-" << _month << "-" <<_day;
}

如上,const修饰后的成员函数Print,不可以在对类的任何成员进行修改

特点

const修饰的成员函数,const放在参数列表后。

②const修饰后,成员函数不可以修改类对象的任何成员

++使用const,可以避免成员被意外修改,应加尽加++

取地址运算符重载

对于自定义类型,只要是运算符,要使用必须先重载。

cpp 复制代码
Date* operator&()
{
    return this;
}

const Date* operator&() const
{
    return this;
}

为了++避免权限问题++ ,需要重载取Date*指针和const Date*指针。或者可以自定义返回一个任意地址(也可空指针),不过要当心出错。

类型转换

C++11,支持**++内置类型++ 隐式类型转化为++自定义类型++**,但是++需要有相关内置类型为参数的构造函数++ 。

该隐式转换过程中需要调用到构造函数。

cpp 复制代码
//类A的构造函数
A(int a1)
:_aa1(a1)
{}

//运行代码
A aa1 = 1;

①语法上,先用常数1++作为构造函数的参数++++构造++一个临时对象,再用这个临时对象++拷贝构造++为aa1。这里++会出现连续的构造,而编译器会将其优化为直接一次构造++。

cpp 复制代码
A& aa2 = 1;//不可行×

如上,要注意++以1构造的临时对象为const修饰++,要注意权限问题。

cpp 复制代码
const A& aa3 = 1;

如果不想发生内置类型隐式转换为自定义类型,则用++关键字explicit++。

③若A类型有多个内置类型成员(构造函数有多个参数),想用两个或以上参数进行隐式转换,需要用大括号和逗号表达。(如下)。

cpp 复制代码
A aa3 = {1, 1}

static成员

①static修饰的成员变量,成为静态成员变量,static变量必须要在类外初始化。(类里面声明,类外初始化

②static成员变量不属于某个具体对象存放在静态区

③static修饰的成员函数,称之为静态成员函数,static函数没有this指针

④static成员函数可以访问静态成员但是不能访问非静态的成员,因为他没有this指针,没有隐藏的this指针

不可以在声明时给static成员变量缺省值

⑥**++非静态成员函数++** ,++可以访问任意的静态成员变量和静态成员函数++。

⑦同样受访问限定符限制

友元

提供了一种突破类访问限定符的封装来访问的方式,在声明前加friend修饰,友元分为友元函数友元类

特点

①友元函数可以访问类的私有和保护成员,但他**++只是声明++** ,++不是类的成员函数++++而是外部函数++

②友元可以在类的任何位置声明,++不受访问限定符的限制++ 。

③一个类中,友元类的成员函数也是该类的友元函数

一个函数可以是多个类的友元函数

不具有交换性和传递性。比如,A是B的友元,但是B不是A的友元;A是B的友元,B是C的友元,但是A不是C的友元。

友元会破坏封装,所以不适宜多用

❤~~本文完结!!感谢观看!!接下来更精彩!!欢迎来我博客做客~~❤

相关推荐
小严家15 小时前
Flutter完整开发指南 | Flutter&Dart – The Complete Guide
开发语言·flutter
宇宙的尽头是PYTHON15 小时前
用生活中的实例解释java的类class和方法public static void main
java·开发语言·生活
道传科技上位机15 小时前
C# 循环和条件用法大全(while dowhile for foreach if Switch try)全站最全
开发语言·c#
寻星探路15 小时前
Java EE初阶启程记04---线程的状态
java·开发语言·jvm·java-ee
攻城狮7号15 小时前
【AI时代速通QT】第八节:Visual Studio与Qt-从项目迁移到多版本管理
c++·qt·跨平台·visual studio·qt vs tools
努力也学不会java15 小时前
【Java并发】揭秘Lock体系 -- 深入理解ReentrantLock
java·开发语言·人工智能·python·机器学习·reentrantlock
郝学胜-神的一滴15 小时前
QAxios研发笔记(一):在Qt环境下,构建Promise风格的Get请求接口
开发语言·c++·spring boot·qt·ajax·前端框架·软件工程
AA陈超15 小时前
虚幻引擎UE5专用服务器游戏开发-21 连招技能动画蒙太奇播放
c++·游戏·ue5·游戏引擎·虚幻
haokan_Jia15 小时前
【MyBatis-Plus 动态数据源的默认行为】
java·开发语言·mybatis
扫地的小何尚18 小时前
NVIDIA Dynamo深度解析:如何优雅地解决LLM推理中的KV缓存瓶颈
开发语言·人工智能·深度学习·机器学习·缓存·llm·nvidia