C++的类功能整合

1. 类的基本概念

类是面向对象编程的核心,它封装了数据和操作数据的函数。

#include <iostream>
using namespace std;class MyClass {
public:int publicData;void publicFunction() {cout << "Public function" << endl;}private:int privateData;void privateFunction() {cout << "Private function" << endl;}
};int main() {MyClass obj;obj.publicData = 10;obj.publicFunction();// obj.privateData = 20; // 错误:private成员无法直接访问// obj.privateFunction(); // 错误:private成员无法直接访问return 0;
}

2. 成员变量和成员函数

成员变量是类中的数据,成员函数是类中的函数。

#include <iostream>
using namespace std;class MyClass {
public:int data; // 成员变量void display() { // 成员函数cout << "Data: " << data << endl;}
};int main() {MyClass obj;obj.data = 42;obj.display(); // 输出: Data: 42return 0;
}

3. 访问修饰符

  • public:任何地方都可以访问。
  • private:只能类内部访问。
  • protected:类内部和派生类可以访问。
    #include <iostream>
    using namespace std;class MyClass {
    public:int publicData;private:int privateData;protected:int protectedData;public:void display() {cout << "Public: " << publicData << endl;cout << "Private: " << privateData << endl;cout << "Protected: " << protectedData << endl;}
    };int main() {MyClass obj;obj.publicData = 10;// obj.privateData = 20; // 错误:private成员无法直接访问// obj.protectedData = 30; // 错误:protected成员无法直接访问obj.display();return 0;
    }

4. 构造函数和析构函数

构造函数在对象创建时调用,析构函数在对象销毁时调用。

#include <iostream>
using namespace std;class MyClass {
public:MyClass() {cout << "Constructor" << endl;}~MyClass() {cout << "Destructor" << endl;}
};int main() {MyClass obj; // 创建对象时调用构造函数// 程序结束时调用析构函数return 0;
}

5. 运算符重载

允许自定义运算符的行为。

#include <iostream>
using namespace std;class Complex {
public:double real, imag;Complex(double r, double i) : real(r), imag(i) {}Complex operator + (const Complex& other) {return Complex(real + other.real, imag + other.imag);}
};int main() {Complex c1(1.0, 2.0);Complex c2(3.0, 4.0);Complex c3 = c1 + c2;cout << "c3: " << c3.real << " + " << c3.imag << "i" << endl; // 输出: c3: 4 + 6ireturn 0;
}

6. 拷贝构造函数和赋值运算符

用于对象的拷贝和赋值。

#include <iostream>
using namespace std;class MyClass {
public:int data;MyClass(int d) : data(d) {}MyClass(const MyClass& other) : data(other.data) {cout << "Copy constructor" << endl;}MyClass& operator = (const MyClass& other) {if (this != &other) {data = other.data;}return *this;}
};int main() {MyClass obj1(42);MyClass obj2 = obj1; // 调用拷贝构造函数MyClass obj3(0);obj3 = obj1; // 调用赋值运算符cout << "obj2.data: " << obj2.data << endl; // 输出: obj2.data: 42cout << "obj3.data: " << obj3.data << endl; // 输出: obj3.data: 42return 0;
}

7. 模板类

允许类在编译时根据类型参数生成不同的类。

#include <iostream>
using namespace std;template <typename T>
class MyTemplateClass {
public:T data;MyTemplateClass(T d) : data(d) {}void display() {cout << "Data: " << data << endl;}
};int main() {MyTemplateClass<int> intObj(42);intObj.display(); // 输出: Data: 42MyTemplateClass<double> doubleObj(3.14);doubleObj.display(); // 输出: Data: 3.14return 0;
}

8. 异常处理

用于处理运行时错误。

#include <iostream>
#include <exception>
using namespace std;class MyException : public exception {
public:const char* what() const throw() {return "My custom exception";}
};void throwException() {throw MyException();
}int main() {try {throwException();} catch (const MyException& e) {cout << "Caught exception: " << e.what() << endl; // 输出: Caught exception: My custom exception}return 0;
}


 

9. 智能指针

自动管理内存,避免内存泄漏。

#include <iostream>
#include <memory>
using namespace std;class MyClass {
public:void display() {cout << "Display" << endl;}
};int main() {unique_ptr<MyClass> ptr(new MyClass());ptr->display(); // 输出: Displayreturn 0;
}


 

10. 继承和多态

继承允许子类继承父类的特性,多态允许同一接口有多种实现。

#include <iostream>
using namespace std;class Base {
public:virtual void display() const {cout << "Base class display" << endl;}virtual ~Base() {}
};class Derived : public Base {
public:void display() const override {cout << "Derived class display" << endl;}
};int main() {Base* b = new Derived();b->display(); // 输出: Derived class displaydelete b;return 0;
}

11. 纯虚函数和抽象类

纯虚函数使得类成为抽象类,不能直接实例化。

#include <iostream>
using namespace std;class AbstractBase {
public:virtual void pureVirtualFunction() const = 0;virtual ~AbstractBase() {}
};class ConcreteDerived : public AbstractBase {
public:void pureVirtualFunction() const override {cout << "Concrete implementation" << endl;}
};int main() {AbstractBase* a = new ConcreteDerived();a->pureVirtualFunction(); // 输出: Concrete implementationdelete a;return 0;
}

12. 友元函数和友元类

友元可以访问类的私有成员。

#include <iostream>
using namespace std;class MyClass {
private:int privateData;public:MyClass(int data) : privateData(data) {}friend void friendFunction(const MyClass& obj);friend class FriendClass;
};void friendFunction(const MyClass& obj) {cout << "Private data: " << obj.privateData << endl;
}class FriendClass {
public:void display(const MyClass& obj) {cout << "Private data: " << obj.privateData << endl;}
};int main() {MyClass obj(42);friendFunction(obj); // 输出: Private data: 42FriendClass fc;fc.display(obj); // 输出: Private data: 42return 0;
}

13. 嵌套类

嵌套类是定义在另一个类内部的类。

#include <iostream>
using namespace std;class OuterClass {
public:class InnerClass {public:void display() const {cout << "Inner class display" << endl;}};void outerFunction() {InnerClass inner;inner.display();}
};int main() {OuterClass::InnerClass inner;inner.display(); // 输出: Inner class displayOuterClass outer;outer.outerFunction(); // 输出: Inner class displayreturn 0;
}

14. 静态成员

静态成员属于类,而不是某个具体的对象。

#include <iostream>
using namespace std;class MyClass {
public:static int staticData;static void staticFunction() {cout << "Static data: " << staticData << endl;}
};int MyClass::staticData = 10;int main() {MyClass::staticFunction(); // 输出: Static data: 10MyClass::staticData = 20;MyClass::staticFunction(); // 输出: Static data: 20return 0;
}

15. 类型转换运算符

类型转换运算符允许将类的对象转换为其他类型。

#include <iostream>
using namespace std;class MyInteger {
private:int value;public:MyInteger(int val) : value(val) {}operator int() const {return value;}
};int main() {MyInteger mi(42);int num = mi; // 使用类型转换运算符cout << "num: " << num << endl; // 输出: num: 42return 0;
}

16. 命名空间

命名空间用于避免名称冲突。

#include <iostream>
using namespace std;namespace MyNamespace {void display() {cout << "Namespace display" << endl;}
}int main() {MyNamespace::display(); // 输出: Namespace displayreturn 0;
}

总结

通过这次整合,我们全面探讨了C++类的各个方面,从基本概念到高级特性,如继承、多态、纯虚函数、友元、嵌套类、静态成员、类型转换和命名空间等。这些特性使得C++在面向对象编程中非常强大和灵活。

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

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

相关文章

一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。-多语言

目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目&#xff1a;一个5位数&#xff0c;判断它是不是回文数。即12321是回文数&#xff0c;个位与万位相同&#xff0c;十位与千位相同。 程序分析&#xff1a;学会分解出每一位数。 C 语言实现 #include <stdio.h>…

Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解

Scala集合概述-链接 大家可以点击上方链接&#xff0c;先对Scala的集合有一个整体的概念&#x1f923;&#x1f923;&#x1f923; 在 Scala 中&#xff0c;数组是一种特殊的集合类型&#xff0c;可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中&#xff0c;不可变…

数据库期末复习题库

1. Mysql日志功能有哪些? 记录日常操作和错误信息&#xff0c;以便了解Mysql数据库的运行情况&#xff0c;日常操作&#xff0c;错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份&#xff1a;全部都备份一遍表备份&#xff1a;只提取数据库中的数据&#xff0…

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前&#xff0c;TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore&#xff0c;完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

如何使用 Chrome 无痕浏览模式访问网站?

无痕浏览&#xff08;Incognito Mode&#xff09;是 Google Chrome 浏览器提供的一种隐私保护功能&#xff0c;它允许用户在一个独立的会话中浏览网页&#xff0c;而不会记录用户的浏览历史、下载历史、表单数据等。这对于希望保护个人隐私或进行临时性匿名浏览的用户来说非常有…

如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件

如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件 在使用 Hugging Face 的数据集进行模型训练时&#xff0c;有时我们并不需要整个数据集&#xff0c;尤其是当数据集非常大时。为了节省存储空间和提高训练效率&#xff0c;我们可以从数据集中随机采样一部分数…

无人值守工业控制系统网络安全解决方案

一、现状概述 随着物联网、工业大数据、工业云等技术的发展&#xff0c;工业互联网时代即将到来&#xff0c;工业大数据分析、工业数据可视化、工业生产智能优化分析成为当下发展趋势&#xff0c;使得基于数字技术、网络互连技术的智能监控、无人值守成为可能。目前&#xff0…

.NET 8 实现通用权限开发框架

在.NET 8中实现一个通用权限开发框架&#xff0c;不仅可以提高开发效率&#xff0c;还能保证系统的安全性和可扩展性。本文将介绍如何使用.NET 8构建一个通用权限框架&#xff0c;并提供实例代码展示。 1. 框架概述 一个通用权限开发框架通常包括用户管理、角色管理、权限管理等…

网络安全体系与网络安全模型

4.1 网络安全体系概述 4.1.1 网络安全体系概述 一般面言&#xff0c;网络安全体系是网络安全保障系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规则组成的&#xff0c;共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术…

彻底理解如何保证ElasticSearch和数据库数据一致性问题

一.业务场景举例 需求&#xff1a; 一个卖房业务&#xff0c;双十一前一天&#xff0c;维护楼盘的运营人员突然接到合作开发商的通知&#xff0c;需要上线一批热门的楼盘列表&#xff0c;上传完成后&#xff0c;C端小程序支持按楼盘的名称、户型、面积等产品属性全模糊搜索热门…

微信小程序下拉刷新与上拉触底的全面教程

微信小程序下拉刷新与上拉触底的全面教程 引言 在微信小程序的开发中,用户体验至关重要。下拉刷新和上拉触底是提高用户交互体验的重要功能,能够让用户轻松获取最新数据和内容。本文将详细介绍这两个功能的实现方式,结合实际案例、代码示例和图片展示,帮助开发者轻松掌握…

Robot Framework中常用变量的一些操作

一. 简介 前面学习了 Robot Framework中常用变量&#xff0c;文章如下&#xff1a; Robot Framework框架中常用的变量-CSDN博客 本文继续来学习这几个变量&#xff08;标量&#xff0c;列表&#xff0c;字典&#xff09;的操作。 二. Robot Framework中常用变量的一些操作 …

vue3项目搭建-6-axios 基础配置

axios 基础配置 安装 axios npm install axios 创建 axios 实例&#xff0c;配置基地址&#xff0c;配置拦截器,目录&#xff1a;utils/http.js 基地址&#xff1a;在每次访问时&#xff0c;自动作为相对路径的根 // axios 基础封装 import axios from "axios";…

23种设计模式-抽象工厂(Abstract Factory)设计模式

文章目录 一.什么是抽象工厂设计模式&#xff1f;二.抽象工厂模式的特点三.抽象工厂模式的结构四.抽象工厂模式的优缺点五.抽象工厂模式的 C 实现六.抽象工厂模式的 Java 实现七.代码解析八.总结 类图&#xff1a; 抽象工厂设计模式类图 一.什么是抽象工厂设计模式&#xff1f…

uart_pl011.c驱动API的zephyr测试

API概述 本次测试针对uart的uart_poll_in和uart_poll_outAPI进行测试&#xff0c; uart_poll_in static int pl011_poll_in(const struct device *dev, unsigned char *c)这是一个轮询方式的接收函数&#xff1a; 功能&#xff1a;检查 UART 是否有新数据到达&#xff0c;如…

【Linux探索学习】第十七弹——进程终止:深入解析操作系统中的进程终止机制

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在操作系统中&#xff0c;进程终止是一个至关重要的阶段&#xff0c;它标志着进程的生命周期结束。进程终止可能是因为任务完成&#xff0…

Vue 3 组件通信教程

Vue 3 组件通信教程 1. Props 父传子 1.1 基础用法 在 Vue 3 中&#xff0c;我们使用 defineProps 来声明组件的 props&#xff1a; <!-- 子组件 ChildComponent.vue --> <script setup> const props defineProps({message: String,count: {type: Number,requ…

MySQL更新JSON字段key:value形式

MySQL更新JSON字段key:value形式 1. 介绍 ‌MySQL的JSON数据类型‌是MySQL 5.7及以上版本中引入的一种数据类型&#xff0c;用于存储JSON格式的数据。使用JSON数据类型可以自动校验文档是否满足JSON格式的要求&#xff0c;优化存储格式&#xff0c;并允许快速访问文档中的特定…

javax.xml.ws.soap.SOAPFaultException: ZONE_OFFSET

javax.xml.ws.soap.SOAPFaultException 表示 SOAP 调用过程中发生了错误&#xff0c;并且服务端返回了一个 SOAP Fault。 错误信息中提到的 ZONE_OFFSET 可能指的是时区偏移量。在日期和时间处理中&#xff0c;时区偏移量是指格林威治标准时间 (GMT) 的偏移量。如果服务期望特…

软路由设置ip地址实现一机一IP

软路由作为一种灵活且强大的网络设备&#xff0c;越来越受到家庭和小型企业用户的青睐。通过软路由配置代理IP&#xff0c;不仅可以提升网络性能&#xff0c;还能保护隐私和实现更多高级功能。本文将详细介绍如何在软路由中配置代理IP&#xff0c;帮助你轻松实现更高效的网络管…