C++学习笔记之类对象(一)

news2024/11/29 20:35:19

C++学习笔记之类&对象(一)

https://www.runoob.com/cplusplus/cpp-classes-objects.html

类是C++的核心特性,为用户自定义的数据类型,可以在其中放入数据和函数作为成员,并且以此为模板,创建多个对象个体进行使用

1、类&对象

定义类需要使用关键字class,然后为类指定名称,在使用花括号包裹的代码块内部,放置类的成员变量以及成员函数

成员变量表示的是类当中的数据,而成员函数代表的是方法,可以对数据进行各种操作

class Rectangle
{
public:   // 访问属性 
    double length;     // 成员变量
    double width;
};     // 分号结束

以上是一个简单的类定义,其中仅有两个成员变量,分别用以表示矩形的长和宽,这里面并没有声明成员函数,两个变量的访问属性都是public公共的,因此在类外是可以直接借助类的对象进行访问的

通常对于类的使用,是借助于创建对应类的对象进行实现的
我们将类看作一个基本的数据类型的话,对象其实就如同是某个类型的变量一般的存在

Rectangle rect1;   // 类的对象1
Rectangle rect2;   // 类的对象2

创建出的同一个类不同的对象rect1和rect2,它们就如同两部华为Mate60,同样是Mate60的标准生产出来的,但是是两个不同的个体,Mate60这个标准就等同于类的概念,作为一个模板或者说标准,而依照这个标准制造的具体的个体则是对象的概念

2、访问数据成员

class Rectangle
{
public:   // 访问属性 
    double length;
    double width;
    // 成员函数声明
    void set(double l, double w);
    double get();
};
// 成员函数定义
void Rectangle::set(double l, double w)
{
    length = l;
    width = w;
}

double Rectangle::get()
{
    return length * width;
}

对于访问权限为public的成员函数或者成员变量,可以直接通过的类的对象使用.运算符进行访问或者调用

Rectangle rect1;
rect1.length = 8;
rect1.width = 6;
cout << "rect1的面积=" << rect1.get() << endl; 
Rectangle rect2;
rect2.set(12, 5);
cout << "rect2的面积=" << rect2.get() << endl;

在这里插入图片描述

3、类的成员函数

其实在上面已经使用到了类的成员函数,而类的成员函数就是指那些把定义和原型写在类定义内部的函数
成员函数可以操作类的任意对象,访问对象中的所有成员

成员函数可以定义在类定义内部,或者单独使用范围解析运算符::定义

class Rectangle
{
public:   // 访问属性 
    double length;
    double width;
    double get()
    {
        return length * width;
    }
};

像上面这样,将函数定义在类定义内部,此时函数被声明为内联,即使没有使用inline标识符

class Rectangle
{
public:   
    double length;
    double width;
    double get();   // 	仅仅进行声明
};

double Rectangle::get()     // 类外对于方法进行具体实现
{
    return length * width;
}

也可以在类的外部使用范围解析运算符::进行具体实现,而在类的内部仅仅声明一下
使用::关联到类,因此需要在前面加上类名,后面则是已经在类中声明的函数名

Rectangle rect1;
rect1.length = 8;
rect1.width = 6;
cout << "rect1的面积=" << rect1.get() << endl; 

最后,通过类的对象进行成员函数的调用

4、类的访问修饰符

类的访问修饰符与面向对象编程的封装有着密切关系,通过使用访问修饰符限制代码对于函数内部成员的直接访问

C++中使用publicprivateprotected关键字作为访问修饰符
对于一个类来说,可以有多个publicprotectedprivate标记区域,每个标记区域在下一个标记区域开始之前或遇到类主体结束右括号之前都是有效的
成员和类的默认访问修饰符都是private

class Base {
public:
// 公有成员
protected:
// 保护成员
private:
// 私有成员    
};

4.1、public成员

public成员在类的外部是可以直接访问的

class Rectangle
{
public:   // 公共成员
    double length;
    double width;
    double get();
};

double Rectangle::get()
{
    return length * width;
}

int main()
{
        Rectangle rect;
        rect.length = 8;   // 直接访问
        rect.width = 6;
}

4.2、private成员

private成员变量或函数在类的外部是不可访问的,仅可以通过类和友元函数可以访问
一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数

class Rectangle
{  // 默认私有
    double length;
    double width;
public:  
    void setWidth(double w)
    {
        width = w;
    }
    void setLength(double l)
    {
        length = l;
    }
};

int main()
{
    Rectangle rect;
    rect.setWidth(6);
    rect.setLength(8);
}

4.3、protected成员

protected成员变量或函数在子类中式可访问的,这需要涉及到继承相关的概念
protected所代表的关系大概就是一种传承的关系,比如刘备有诸葛亮作为军师,那么诸葛亮可能就是刘备的protected 成员,那么这是刘备专属,别人不能拿去用,但是阿斗继承了刘备,那么这份归属权就交到了阿斗手上,那么诸葛亮也可以是阿斗的军师

class LiuBei {
protected:
    string junShi = "诸葛亮";
};

class ADou : LiuBei {   // 继承
public:
    void work()
    {
        cout << "请" << junShi << "协助办公" << endl;   // 取出父类的protected成员
    };
};

int main()
{
        ADou ad;
        ad.work();
}

4.4、继承中的特点

在C++中,类的继承分为publicprivateprotected三种方式
以下表示父类对应访问修饰的成员,在继承到子类后对应的访问权限变化情况

  • public继承
父类publicprivateprotected
子类publicprivateprotected
class A
{
    private:
        int a;
    public:
        int b;
    protected:
        int c;        
};

class B : public A  
{
    public:
        void print()
        {
            cout << b << ", " << c << endl;  // a是private,子类不可访问
        }
};

int main()
{
    B bob;
    bob.b = 10;   // b是public,c是protected只能向下传
}
  • private继承
父类publicprivateprotected
子类privateprivateprivate
class A
{
    private:
        int a;
    public:
        int b;
    protected:
        int c;            
};

class B : private A   // 可省略,默认是私有继承
{
    public:
        void print()
        {
            cout << b << ", " << c << endl;  // 都是private,bc是子类,a是父类
        }
};

int main()
{
    B bob;   // 全都访问不了
}
  • protected继承
父类publicprivateprotected
子类protectedprivateprotected
class A
{
    private:
        int a;
    public:
        int b;
    protected:
        int c;            
};

class B : protected A
{
    public:
        void print()
        {
            cout << b << ", " << c << endl;
        }
};

int main()
{
    B bob;   // b、c都是protected,只能向下传
}

其中,

  • private修饰的成员依然只能由类本身以及友元访问,子类也是无法访问
  • protected修饰的成员则是可以被子类访问

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

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

相关文章

三维世界的魅力:探索开源的Three.js案例

三维世界的魅力&#xff1a;探索开源的Three.js案例 原生Three.js 和 Cesium.js 案例 - 不断 - 只做开源 。 引言 在这个数字化时代&#xff0c;三维技术已经成为我们生活中不可或缺的一部分。无论是在游戏、电影制作、建筑设计还是虚拟现实中&#xff0c;三维技术都发挥…

ARM Assembly: 第8课 branching

branch causes a branch to a target address. The "B" mnemonic signifies an unconditional branch. 单个的B表示进入一个无条件的分支&#xff0c;而含条件的分支通常可以基于APSR 条件flag进行指令的执行。比如&#xff0c;基于condition flag z是否为1, 我们可…

深度学习基础—目标定位与特征点检测

1.目标定位 &#xff08;1&#xff09;定义 目标定位就是在图片中&#xff0c;定位对象的位置&#xff0c;对于对象的位置可以用框圈住显示。如下图所示&#xff1a; 假设正在进行图片分类工作&#xff0c;那么这个汽车图片很有可能被分类为汽车类别。对于目标定位&#xff0c;…

[图形学]smallpt代码详解(1)

一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍&#xff0c;和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…

C# List遍历元素重新赋值问题

需求&#xff1a;修改List<string>类型的链表的每一个string对象。 第一反应是List.ForEach&#xff0c;但是使用完后&#xff0c;原链表还是原链表&#xff1b; 后来又学习了一下&#xff0c;了解到C#用foreach语句对数组进行遍历,只能采用只读的方式,不能修改任何元素…

探索Kimi:用Spring Boot + Vue打造现代网站

在数字化时代&#xff0c;网站成为了企业和个人展示自己的窗口。今天&#xff0c;我将带你一起探索如何利用Spring Boot和Vue.js这两个强大的技术栈&#xff0c;结合Kimi的智能助手功能&#xff0c;来构建一个现代的网站。这不仅是一个技术分享&#xff0c;更是一次实战演示&am…

一个信号量操作的例子

代码&#xff1a; #include<stdio.h> #include<sys/sem.h> #include<sys/ipc.h> #include<errno.h> #include<string.h> typedef int sem_t; union semun{ int val; struct semid_ds *buf; unsigned short *array; }arg;sem_t CreateSem(key_t …

【Qt】控件概述 (1)—— Widget属性

控件概述 1. QWidget核心属性1.1核心属性概述1.2 enable1.3 geometry——窗口坐标1.4 window frame的影响1.4 windowTitle——窗口标题1.5 windowIcon——窗口图标1.6 windowOpacity——透明度设置1.7 cursor——光标设置1.8 font——字体设置1.9 toolTip——鼠标悬停提示设置1…

IDEA中用过git之后文件名颜色全变红

在File->Settings->Version Control里点击左下角的号&#xff0c; 选择<none> 之后点击Apply即可恢复之前的颜色

11.1 Linux_线程_线程相关函数

概述 线程的共享资源&#xff1a; 可执行的指令、静态数据、文件描述符、当前工作目录、用户ID、用户组ID 线程的私有资源&#xff1a; 线程ID、程序计数器PC和相关寄存器、堆栈、错误号、优先级、执行状态和属性 线程编译&#xff1a; gcc <.c文件> -l pthread -o…

代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作删除二叉搜索树中的节点修剪二叉搜索树

代码随想录 | Day26 | 二叉树&#xff1a;二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树 主要学习内容&#xff1a; 二叉搜索树的插入删除操作 701.二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作 - 力扣&#xff08;LeetCode&…

企业级数据备份一般都是怎么做的?来唠唠嗑

小白最近去了很多企业看了一下他们的存储方案&#xff0c;基本上都是单硬盘数据存储&#xff0c;一个硬盘10TB&#xff08;实际可用8TB左右&#xff09;。 这些大概是大部分微小企业存储数据的办法&#xff0c;也是他们能想到的最好办法了吧。 截至2024年的今天&#xff0c;咱…

MATLAB|基于多主体主从博弈的区域综合能源系统低碳经济优化调度

目录 主要内容 程序亮点&#xff1a; 模型研究 一、综合能源模型 二、主从博弈框架 部分代码 结果一览 下载链接 主要内容 程序参考文献《基于多主体主从博弈的区域综合能源系统低碳经济优化调度》&#xff0c;采用了区域综合能源系统多主体博弈协同优化方…

vim 操作

vim编辑器的有三种工作模式&#xff1a;命令模式、插入模式和底行命令模式 打开进入命令模式&#xff1a; 由命令模式到输入模式&#xff1a;i:在光标前插&#xff1b;a:在光标后插&#xff1b;o:在下一行插 由输入模式进入命令模式&#xff1a;esc 由命令模式进入底行命令…

判断推理(2)

集合推理: 这是不能串在一起的&#xff0c;再进行合并推理的时候有的一定要放在开头 D D 第二句属于真假推理 然后进行翻译推理的时候一定要让有的打头&#xff0c;所以让1或者是2打头&#xff0c;但是1如果是最开头的话那么就什么也推不出来&#xff0c;所以只能是2打头B B A…

Pikachu-Cross-Site Scripting-xss之htmlspecialchars

首先输入各种字符 查看页面元素&#xff0c;可以看到这里对一些符号做了转换&#xff0c;但是 单引号等几个符号没处理&#xff1b; 从代码上看&#xff1b;使用单引号做闭合&#xff1b; 构造payload a onclickalert(11) 提交&#xff0c;得到xss攻击

【Java】springboot 项目中出现中文乱码

在刚创建的springboot项目中&#xff0c;出现乱码&#xff0c;跟走着解决一下 1、Ctrl Shift S 打开idea设置&#xff0c;根据图片来&#xff0c;将③④这三个地方都修改为UTF-8 2、返回配置查看&#xff0c;解决

僵尸进程、孤儿进程和守护进程

让我们详细讨论僵尸进程、孤儿进程和守护进程。 1. 僵尸进程 (Zombie Process) 定义: 僵尸进程是指一个已经终止执行&#xff08;结束运行&#xff09;&#xff0c;但其父进程尚未对其进行清理&#xff08;调用wait()或waitpid()系统调用来获取子进程的退出状态&#xff09;的…

Docker 从安装到实战

Docker 是一个开源的平台&#xff0c;用于自动化应用程序的部署、扩展和管理。它利用操作系统级别的虚拟化&#xff0c;将应用程序及其依赖项封装在称为容器的轻量级、可移植的单元中。以下是 Docker 的一些关键特点&#xff1a; 容器化&#xff1a;Docker 容器可以在任何支持 …

(8)MATLAB瑞利衰落信道仿真1

文章目录 一、瑞利随机变量及其概率密度函数二、仿真代码三、仿真结果四、仿真代码的几点补充说明其他 一、瑞利随机变量及其概率密度函数 在无线通信中&#xff0c;如果信道中存在大量非视距路径而不存在视距路径信号分量&#xff0c;此时&#xff0c;无线信道可以由一个复高…