c++类基础知识

引入

下面是一个从菜鸟抄来的例子,可以看到BOX定义了两个公共函数,get和set,在类里面声明,在外面定义,也可以直接在里面定义。

#include <iostream>using namespace std;class Box
{public:double length;   // 长度double breadth;  // 宽度double height;   // 高度// 成员函数声明double get(void);void set( double len, double bre, double hei );
};
// 成员函数定义
double Box::get(void)
{return length * breadth * height;
}void Box::set( double len, double bre, double hei)
{length = len;breadth = bre;height = hei;
}
int main( )
{Box Box1;        // 声明 Box1,类型为 BoxBox Box2;        // 声明 Box2,类型为 BoxBox Box3;        // 声明 Box3,类型为 Boxdouble volume = 0.0;     // 用于存储体积// box 1 详述Box1.height = 5.0; Box1.length = 6.0; Box1.breadth = 7.0;// box 2 详述Box2.height = 10.0;Box2.length = 12.0;Box2.breadth = 13.0;// box 1 的体积volume = Box1.height * Box1.length * Box1.breadth;cout << "Box1 的体积:" << volume <<endl;// box 2 的体积volume = Box2.height * Box2.length * Box2.breadth;cout << "Box2 的体积:" << volume <<endl;// box 3 详述Box3.set(16.0, 8.0, 12.0); volume = Box3.get(); cout << "Box3 的体积:" << volume <<endl;return 0;
}

继承

成员类型

与其它语言类似,都有protected、private以及public

private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;

protected 成员可以被派生类访问。

class b{
protected:int bvalue = 5;
};
class a::b{
public:void fun(){cout<<bvalue<<endl;//能访问父类的protected, 不能是private}
};

protected能被继承的类在成员函数中访问,但不能被实例化的变量调用。

无论是声明还是继承,默认就是private

class a{int x;//默认private
};

父子变量名冲突

假如子类中变量与父类变量名冲突了。

class B{
public: int age = 100;
};
class A::public B{
public:int age = 10;	
};int main(void){A a;cout<<a.age;//10。cout<<a.B::age;//命名空间来获取父类 100
}

继承类型

  1. 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
  2. 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
  3. 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。

构造和析构

构造和析构都是没有返回值的,可以允许重载。

初始化列表:用于在构造函数中快速初始化成员变量。

下面代码就直接将构造函数传过来的a赋值给X,b给Y,c给Z

C::C( double a, double b, double c): X(a), Y(b), Z(c)
{....
}

拷贝构造函数:能直接拷贝一个对象构造一个新的对象

是构造函数的一种,属于构造函数的重载。

C::C(const ClassName& other);C c1;
C c2 = C(c1);//能将c1的所有值复制给c2,且c2和c1后续没有什么引用关系。

能用于函数传形参,形参为对象的时候

析构函数:它会在每次删除所创建的实例对象时执行,用于最后释放资源。
与构造函数类似,就是在前面多了个波浪~

C{
public:C()~C();
};

友元变量

友元变量和友元类都不是成员函数和变量,但是可以访问其中的private和protected,只需要在类定义中多一个定义友元的firend关键字。

class Box
{double width;
public:friend void printWidth(Box box);friend class BigBox;void setWidth(double wid);
};class BigBox
{
public :void Print(int width, Box &box){// BigBox是Box的友元类,它可以直接访问Box类的任何成员box.setWidth(width);cout << "Width of box : " << box.width << endl;}
};// 成员函数定义
void Box::setWidth(double wid)
{width = wid;
}// 请注意:printWidth() 不是任何类的成员函数
void printWidth(Box box)
{/* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */cout << "Width of box : " << box.width << endl;
}

静态成员函数

静态成员函数和静态成员变量都只是在普通的变量上加一个static,效果是可以直接通过类名访问,不属于实例化对象的东西,属于类。

class MyClass {
public:static void staticFunction() {}
};

同时,假如是内部的函数,可以直接调用,不用加类名。

派生类的函数也可以直接调用,不用加命名空间。

多态

多态就类似java的抽象类, 基类用virtual关键字定义一个纯虚函数,而子类就必须用override关键字重写纯虚函数。

class Shape {
public:virtual void draw() {std::cout << "绘制形状" << std::endl;}
};class Rectangle : public Shape {
public:void draw() override {std::cout << "绘制矩形" << std::endl;}
};class Circle : public Shape {
public:void draw() override {std::cout << "绘制圆形" << std::endl;}
};int main() {Shape* shape1 = new Rectangle();Shape* shape2 = new Circle();shape1->draw();  // 调用Rectangle的draw函数shape2->draw();  // 调用Circle的draw函数delete shape1;delete shape2;return 0;
}

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

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

相关文章

Docker Compose详细使用讲解!超全!(入门到精通)

Docker Compose详细使用讲解&#xff01;超全&#xff01;(入门到精通) Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过使用Compose&#xff0c;您可以使用YAML文件来配置应用程序的服务、网络和卷&#xff0c;然后使用一个命令来创建和启动所有服务。本…

数据安全的定义及其分类分级

数据安全是指保护数据免受未经授权的访问、使用、泄露、破坏或篡改的过程。数据安全的目标是确保数据的机密性、完整性和可用性&#xff0c;以防止数据被盗窃、篡改或丢失&#xff0c;从而保护个人隐私和组织机密信息。 数据安全可以根据其保护的对象和级别进行分类分级&#x…

input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案

文章目录 input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案问题描述解决办法 onCompositionStart与onCompositionEnd input框添加验证(如只允许输入数字)中文输入导致显示问题的解决方案 问题描述 测试环境&#xff1a;react antd input (react的事件与原生…

Linux Systemd服务创建与配置

在/etc/systemd/system/目录创建并配置服务: 创建一个新的systemd服务单元文件&#xff0c;以描述你的服务配置。 sudo vi /etc/systemd/system/my-service.service 在打开的文件中&#xff0c;添加以下内容来定义你的服务配置&#xff1a; [Unit] Descriptionmqnamesrv After…

无人机GB42590接收端 +接收端模组,同时支持2.4G与5.8G双频

严格按照GB42590的协议开发的发射端&#xff0c;通过串口和模块通讯&#xff0c;默认波特率 921600。 http://www.doit.am/深圳四博智联科技有限公司https://shenzhendoit.taobao.com/category-1734422372.htm?spma1z10.1-c-s.0.0.560c74d77eT01G&searchy&catNameGB4…

VC2022 + protobuf

google这是有私心啊&#xff0c;protobuf从某个版本开始&#xff0c;依赖了一个google自己推出的大型组件集&#xff0c;Abseil&#xff0c;有点类似于Boost了&#xff0c;业内用的人&#xff0c;从个人狭窄的圈子来说&#xff0c;应该是不多的&#xff0c;据说google的众贤用的…

ViewPager2 解决Fragment数据不刷新的问题

一、前言 在最近使用ViewPager2显示多个Fragment的时候遇到一个问题&#xff0c;就是我在删除某个fragment的时候发现更新适配器后页面并没有和如期的一样删除这个fragment&#xff0c;看下到底发生了什么&#xff1f; 二、问题剖析 一般我们刷新页面常用的方法是调用适配器…

【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录 博客详细讲解视频点击查看高清脑图 1. 搭建天气查询http服务1.1. flask代码1.2. 接口优化方法 2. 生成openapi json schema2.1. 测试接口2.2. 生成openapi schema 3. 在dify中创建自定义工具3.1. 导入schema3.2. 设置工具认证信息3.3. 测试工具 4. 调用工具4.1. Agent…

docker启动的mysql8中文乱码问题和无法输入中文

问题描述&#xff1a; 1.中文显示乱码 2.无法输入中文 中文乱码临时方案&#xff1a; show variables like ‘character%’; SET NAMES utf8mb4; SET CHARACTER SET utf8mb4; 中文乱码永久方案&#xff1a; vim /etc/my.cnf[client] default-character-setutf8mb4[mysql]…

Linux详解:进程创建

文章目录 进程创建fork函数写时拷贝页表fork常规用法fork调用失败的原因 进程创建 fork函数 在linux 中fork函数&#xff0c;它从已经存在的进程中创建一个新的进程&#xff0c;新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h> pid_t fork(void);返…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices insmod …

如何通过安全数据传输平台,保护核心数据的安全传输?

在数字化的浪潮中&#xff0c;企业的数据安全传输显得尤为关键。随着网络攻击手段的日益复杂&#xff0c;传统的数据传输方式已不再安全&#xff0c;这就需要我们重视并采取有效的措施&#xff0c;通过安全数据传输平台来保护核心数据。 传统的数据传输面临的主要问题包括&…

C++ std::variant 总结

C std::variant 总结 文章目录 一、std::variant 的由来二、std::variant 用法简介2.1、类型安全保证2.2、访问 std::variant 三、std::variant vs OO 本文来记录一下对C标准库的 std::variant (带标签的联合体)用法的总结。参考文章: hhttps://boolan.com/ 一、std::variant …

【介绍下IDM的实用功能】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【已解决】仅当从 VS 开发人员命令提示符处运行 VS Code 时,cl.exe 生成和调试才可用。

当我们在使用vs code运行.c文件时可能会出现如下报错&#xff1a; 这是因为我们使用的生成和调试方式是cl.exe&#xff0c;我们需要更改到gcc.exe。 解决办法&#xff1a; 将所需运行的文件复制粘贴到新的一个文件夹下&#xff0c;此时再点击运行按钮会弹出如下窗口&#xf…

Vue入门到关门之计算属性与监听属性

一、计算属性 1、什么是计算属性 计算属性是基于其它属性计算得出的属性&#xff0c;就像Python中的property&#xff0c;可以把方法/函数伪装成属性&#xff0c;在模板中可以像普通属性一样使用&#xff0c;但它们是基于响应式依赖进行缓存的。这意味着只有在依赖的响应式数…

Mysql 存在多条数据,按时间取最新的那一组数据

1、数据如下&#xff0c;获取每个用户最近的一次登录数据 思路1&#xff1a;order by group by 先根据UserIdLogInTime排序&#xff0c;再利用Group分组&#xff0c;即可得到每个User_Id的最新数据。 1 SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC; 排…

基于车载点云数据的城市道路特征目标提取与三维重构

作者&#xff1a;邓宇彤&#xff0c;李峰&#xff0c;周思齐等 来源&#xff1a;《北京工业大学学报》 编辑&#xff1a;东岸因为一点人工一点智能公众号 基于车载点云数据的城市道路特征目标提取与三维重构本研究旨在弥补现有研究在处理复杂环境和大数据量上的不足&#xf…

MFC实现ini配置文件的读取

MFC实现 ini 配置文件的读取1 实现的功能&#xff1a;点击导入配置文件按钮可以在旁边编辑框中显示配置文件的路径&#xff0c;以及在下面的编辑框中显示配置文件的内容。 1. 显示配置文件内容的编辑框设置 对于显示配置文件内容的 Edit Contorl 编辑框的属性设置如下&#x…

在Docker容器中部署LibreOffice:通过Dockerfile定制高效办公环境

随着容器技术的普及,Docker已成为快速部署和管理应用的首选工具。LibreOffice作为一款开源的办公套件,以其丰富的功能和兼容性受到许多企业和个人用户的青睐。将LibreOffice集成到Docker容器中,不仅便于跨平台部署,还能实现资源的隔离和管理,特别适合云环境下的文档处理服…