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

《C++》面向对象编程--类(补充)

文章目录

  • 一、构造函数补充
    • 1.1初始化列表
    • 1.2explicit关键字
  • 二、 static成员
    • 2.1基本概念
    • 2.2static成员变量
    • 2.3static成员函数
    • 2.4static const成员
  • 三、友元
    • 3.1基本概念
    • 3.2友元函数
    • 3.3友元类
  • 四、内部类
    • 4.1基本概念
    • 4.2基本语法
    • 4.3内部类特点

一、构造函数补充

1.1初始化列表

class Student {
public:// 使用初始化列表Student(int id, string name) : m_id(id), m_name(name) {// 构造函数体,从第一个冒号开始,后续都为逗号。}
private:int m_id;string m_name;
};

注意:
每个成员变量在初始化列表中最多只能出现一次。

1.2explicit关键字

explicit是C++中的一个关键字,它用于修饰类的单参数构造函数,用来防止编译器进行隐式的类型转换。在没有explicit的情况下,C++编译器会自动执行隐式类型转换,这有时会导致意想不到的结果。

#include<iostream>
using namespace std;class MyString {
public:MyString(int size) { // 允许从int隐式转换为MyString// 分配size大小的空间}
};void printString(const MyString& str) {// 打印字符串
}int main() {printString(10); // 编译器会自动将10转换为MyString对象return 0;
}

printString(10)会隐式调用MyString(int)构造函数创建一个临时对象,这可能不是程序员的本意。通过在构造函数前加上explicit关键字,可以禁止这种隐式转换:

class MyString {
public:explicit MyString(int size) { // 禁止隐式转换// 分配size大小的空间}
};void printString(const MyString& str) {// 打印字符串
}int main() {// printString(10); // 错误!不能隐式转换printString(MyString(10)); // 正确,显式转换return 0;
}

二、 static成员

2.1基本概念

static成员是属于类本身的成员,而不是类的某个特定对象。所有类的对象共享同一个static成员。

2.2static成员变量

class Counter {
public:static int count;  // 声明(类内)Counter() { count++; }~Counter() { count--; }
};int Counter::count = 0;  // 定义和初始化(类外)

它的特点有:

  • 类外定义:必须在类外定义和初始化(除const static整型)

  • 共享性:所有对象共享同一个static变量

访问方式:

Counter c1;
cout << c1.count;      // 通过对象访问
cout << Counter::count; // 通过类名访问

2.3static成员函数

class MathUtils {
public:static double square(double x) {return x * x;}static double add(double a, double b) {return a + b;}
};

它的特点有:

  • 无this指针:不能访问非static成员

  • 直接调用:

 double result = MathUtils::square(5.0);
  • 限制:

    ①不能是虚函数

    ②不能使用const限定

2.4static const成员

class Circle {
public:static const double PI = 3.1415926;  // 类内初始化double area(double r) {return PI * r * r;}
};const double Circle::PI;  // 类外定义(C++17起可省略)

三、友元

3.1基本概念

友元是C++提供的一种打破封装性的特殊机制,它允许外部函数或类访问另一个类的私有成员。

3.2友元函数

class Box {
private:double width;public:friend void printWidth(Box box);  // 声明友元函数Box(double w) : width(w) {}
};// 定义友元函数(不是成员函数)
void printWidth(Box box) {// 可以访问私有成员widthcout << "Width: " << box.width << endl;
}int main() {Box box(10.0);printWidth(box);  // 输出: Width: 10return 0;
}

它的特点有:

  • 友元函数不是类的成员函数

  • 可以访问类的所有成员(包括private和protected)

  • 不受访问限定符影响(可以放在public/private/protected任意区域)

3.3友元类

class A {
private:int secret;public:friend class B;  // 声明B是A的友元类A(int s) : secret(s) {}
};class B {
public:void showA(A& a) {// 可以访问A的私有成员cout << "A's secret: " << a.secret << endl;}
};int main() {A a(42);B b;b.showA(a);  // 输出: A's secret: 42return 0;
}

它的特点有:

  • 友元关系是单向的(B是A的友元 ≠ A是B的友元)

  • 友元关系不传递(A友元B,B友元C ≠ A友元C)

  • 友元关系不能继承

四、内部类

4.1基本概念

内部类是指定义在另一个类内部的类。它在C++中是一个非常有用的特性,可以帮助我们更好地组织代码和实现封装。

4.2基本语法

class Outer {
public:class Inner {  //内部类定义public:void display() {cout << "This is inner class" << endl;}};void useInner() {Inner inner;inner.display();}
};

4.3内部类特点

访问权限:

  • 内部类可以访问外部类的所有成员

  • 外部类不能直接访问内部类的私有成员

作用域:

  • 内部类的作用域限定在外部类中

  • 外部类外使用需要加限定符:Outer::Inner

内存关系:

  • 内部类不占用外部类的内存空间

  • 内部类对象与外部类对象相互独立

http://www.dtcms.com/a/298360.html

相关文章:

  • yarn在macOS上的安装与镜像源配置:全方位指南
  • Modbus RTU转Profinet网关接涡街液体流量计到西门子1200 PLC系统
  • [第十三篇] Spring Boot监控
  • 网络安全-机遇与挑战
  • leetcode 3487. 删除后的最大子数组元素和 简单
  • Java排序算法之<冒泡排序>
  • [python][flask]Flask-Principal 使用详解
  • SpringBoot学习路径--SpringBoot的简单介绍和项目搭建
  • Kafka运维实战 15 - kafka 重设消费者组位移入门和实战【实战】
  • Qt 数据库事务处理与数据安全
  • Qt OpenGL 集成:开发 3D 图形应用
  • 工程师实践出真知
  • 上位机知识篇---Jetson Nano的深度学习GPU推理
  • 基于springboot的小区车位租售管理系统
  • 代码随想录算法训练营第三十天
  • MySQL索引背后的B+树奥秘
  • 7月25日 农业农村部与中国气象局联合发布农田渍涝灾害风险预警
  • 标准电码本(修订本)
  • 搜索引擎简介
  • ZABBIX配置自动发现与自动注册,网易邮箱告警和钉钉告警
  • 如何高效通过3GPP官网查找资料
  • 解决electron+vue-router在history模式下打包后首页空白问题
  • 前端html使用svg实现弧线和圆点样式
  • 服务器托管:网站经常被攻击该怎么办?
  • 线段树学习笔记 - 练习题(3)
  • 查看网站证书有效期
  • 深度学习篇---归一化标准化颜色空间转化
  • Vue3中的标签 ref 与 defineExpose:模板引用与组件暴露
  • 【STM32】CUBEMX下FreeRTOS 任务栈管理与栈溢出检测(CMSIS_V2接口)
  • 【软件工程】构建软件合规防护网:双阶段检查机制的实践之道