【C++】类和对象二

C++初阶——类和对象(二) 阅读详情

定义成员函数

所有成员都必须在类内声明,但是成员函数可以定义在类内也可以定义在类外。
std::string isbn() const { return bookno;}
??? isbn函数是如何获得bookno成员所依赖的对象呢?紧随参数列表之后的const关键字是怎么回事???

引入this

成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象,当我们调用成员函数时,实际上是在替某个对象调用它,用请求该函数的对象地址初始化this。
比如:
Sales_data total;
total.isbn(); //当isbn返回bookno时,隐式的返回total.bookno

等价于伪代码 Sales_data::isbn(&total),其中调用isbn成员时传入了total的地址。
this的目的总是指向“这个对象”,所以this是一个常量指针,不允许改变this中保存的地址。

引入const成员函数

isbn函数中 紧随参数列表之后的const关键字,作用是修改隐式this指针的类型。

默认情况下,this的类型是指向类类型非常量的常量指针,这意味着默认情况下我们不能把this绑定到一个常量对象上。这一情况使得我们不能在一个常量对象上调用普通的成员函数,但实际上isbn函数体内不会改变this所指的对象,所以把this设置为指向常量的指针有助于提高函数的灵活性。

面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数)。

在C++中,只有被声明为const的成员函数才能被一个const类对象调用。要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,这样的成员函数被称为常量成员函数。

总结:
1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
4 ) 常量对象,以及常量对象的引用或指针都只能调用常量成员函数。

类作用域

类本身就是一个作用域,编译器分两步处理类,首先编译成员的声明,然后才轮到成员函数体(如果有的话)。因此,成员函数可随意使用类中的其他成员而无须在意这些成员出现的次序。

定义一个返回this对象的函数

Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;   //返回调用函数的对象
}

当我们调用如下的函数时,total.combine(trans);total 的地址被绑定到隐式的this参数上,而rhs绑定到了trans上。因此当执行units_sold += rhs.units_sold 时,效果等同于求total.units_sold和trans.units_sold的和,然后把结果保存到total.units_sold中。

static静态成员变量

如果想在同类的多个对象之间实现数据共享,也不要用全局变量,那么可以使用静态成员变量。

/*************************************************************************
    > File Name: static.cpp
    > Author: Tanswer_
    > Mail: 98duxm@gmail.com
    > Created Time: 2016年09月28日 星期三 23时23分08秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
class Student
{
private:
    string name;
    int age;
    float score;
    static int num;
    static float total;
public:
    void Display();
    Student(string, int ,float);
    static float GetAve(); //静态成员函数
};

int Student::num = 0; //初始化静态成员变量
float Student::total = 0;

Student::Student(string name1,int age1,float score1)
{
    this -> name = name1;
    this -> age = age1;
    this -> score = score1;
    num++;
    total += score1;
}

void Student::Display()
{
    cout << name << "的年龄" << age << ",分数为 " << score ;
    cout << "当前公有" << num << "名学生" << endl;
}

float Student::GetAve()
{
    return total / num;
}

int main()
{
    //使用匿名对象
    (new Student("小明",19,80)) -> Display();
    (new Student("小红",20,85)) -> Display();
    (new Student("小华",21,90)) -> Display();
    (new Student("小画",22,95)) -> Display();
    cout << "平均成绩为: " << Student::GetAve() << endl;

    return 0;
}
  1. static 成员变量属于类,不属于某个具体的对象,这就意味着,即使创建多个对象,也只为 num 分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 num,也会影响到其他对象,所有对象共享这些静态变量。
  2. static 成员变量必须先初始化才能使用,而且只能在类体外进行,否则链接错误。
  3. static 成员变量的内存空间既不是在声明类时分配,也不是在创建对象时分配,而是在初始化时分配。
  4. static 成员变量与对象无关,不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问,访问的是同一块内存。
  5. 访问成员变量的方式:
//通过类来访问
Student::num = 10;
//通过对象来访问
Student stu;
stu.num = 10;

static静态成员函数

当调用一个对象的成员函数(非静态成员函数)时,系统会把当前对象的起始地址赋给 this 指针。而静态成员函数并不属于某一对象,它与任何对象都无关,因此静态成员函数没有 this 指针。既然它没有指向某一对象,就无法对该对象中的非静态成员进行访问。
静态成员函数可以直接引用本类中的静态数据成员,因为静态成员同样是属于类的,可以直接引用。在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。

上面实例代码中,定义了total 和 num 两个静态成员变量,定义了GetAve() 静态成员函数,只使用了total 和 num 两个静态成员变量。

桂电C++面向对象程序设计实验: 实验二 类和对象一 桂电C++面向对象程序设计实验: 实验二 类和对象一 实验内容: (1)有以下程序: /# include using namespace std ; class Time //定义Time类 { public: //数据成员为公用的 int hour ; int minute ; i... 阅读详情

相关推荐

C++ 实验二 类和对象

实验二 类和对象 一、目的要求 1、理解面向对象的程序设计的特点; 2、学会类和对象的定义以及对象成员的引用; 3、理解类的封装性和信息隐藏,学会类声明和成员函数定义的分离。 二、实验内容与步骤 1.设计一个类,成员变量包括学号、姓名、性别、年龄、成绩; 2.完成以下: (1)由键盘分别输入n个学生的学号、姓名、性别、年龄、成绩; (2)计算每个学生的平均成绩; (3)判断每...

陈风的博客 3776

c++ — 类和对象

我们在学习C语言时知道,C语言是面向过程的语言,他关系的是是完成事情的过程,以函数进行驱动,在对于比较规模的程序来说,我们可以直接编写出一个mian'xiang'guo'cehng

水澹澹兮生烟 3541

C++实验4 类和对象(二)

开发工具及环境:PC机一套 Visual Studio 2010 实验要求: 1.硬件基本配置:Intel PentiumIII以上级别的CPU,大于64MB的内存。 2.软件要求:Window 2000操作系统,Visual Studio 6.0或更高版本开发环 境。 3.实验学时:2学时 4.实现实验内容中的题目。 5.写实验报告 实验目的: 1. 掌握类的构造函数和析构函数的概念和使用方法 ...

Laic Zhang的博客 7887

C++ ② 类和对象

C++ ② 类和对象 (上):1类的定义 2实例化 3this指针 (中):4类的默认成员函数 5构造函数 6析构函数 7.拷贝构造函数 8运算符重载 (下):9.类型转换 10.static成员 11.友元12.内部类 13.名对象

Zjgyytt_sodayo的博客 1343

STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64)

STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64) MCU型号为STM32F103RCT6,OLED屏为中景园电子1.3寸屏,驱动芯片为sh1106,分辨率为128x64,MDK版本为V5.34。

Master_0_的博客 6270

微机原理与接口技术第六版周荷琴课后习题答案及解析(期末重点)

第二章 1.8086/8088CPU可直接寻址多少个内存(字节)单元?多少个I/O端口?它们的外部数据总线各有多少根? 8086/8088CPU使用的是20位地址总线,因此可以直接寻址2的20次方个内存单元(即1,048,576),每个单元大小为1字节,因此可以直接寻址2的20次方个字节的内存。 8086/8088CPU有64K个I/O端口,每个端口占用1字节的地址空间,因此可以直接寻址6...

Wmicheng的博客 1万+

类与对象(C++)

类和对象 c++基础语法

2401_85144800的博客 2105

MATLAB下pdf文件操作读取示例

当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。

UESTC 五高考3模拟的博客 6557

c++类与对象(初学超详细讲解)

c++类与对象 一、类的结构 1、类使用关键词class进行定义,四要素:类名、数据成员、函数成员、访问限定符。 2、访问限定符有:private----私有,public------公有,protected------保护 【注】类的数据类型在默认情况下是private,结构体的数据在默认情况下是public 3、成员函数的定义方式有两种:1)直接在类的内部进行定义 2)在类的内部进行函数的声明,在类的外部进行函数的定义 【注】在外部进行定义时需要使用域作用符 :: ,格式为 返回值类型 类名::函数名

qq_51577238的博客 8577

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型 当前AI企业级应用面临三大核心挑战:业务场景深度非标化、技术落地"最后一公里"困局、以及市场竞争焦点转向实用价值。前线部署工程师(FDE)作为破局关键,通过技术-业务-产品三维交汇的复合能力,将AI从实验室推向生产环境。FDE不仅是技术架构师,更是业务价值挖掘机和产品进化传感器,通过"碎石路-高速公路"双循环模式,将定制化需求沉淀为可复用的平台能力。这种模式颠覆了传统SaaS的销售逻辑,形成基于价值的J型增长

随笔记录-分享&记忆 3984

ε-差分隐私之拉普拉斯噪声机制(定义 + 证明 + 代码)

ε-差分隐私之拉普拉斯噪声机制 差分隐私的描述 1-范式的定义:使用matlab调用函数norm(x, 1) 更多范式见 范式 差分隐私的定义应该满足 拉普拉斯噪声的证明全过程如下: DP方向差分隐私证明是基本入门!!! -拉普拉斯噪声分布代码 Laplace分布的概率密度函数的形式是: 使用python - matplotlib来绘制概率分布图: import matplotlib.pyplot as plt import numpy as np def laplace_fun

毕业才是起点 1万+

C++类和对象详细总结

类与对象概念 什么是对象 对象是一个实体,我们眼睛看到的所有实体都可以看成一个实体对象 什么是类 类是用来对实体(对象)进行描述的。(对象有什么属性,有什么功能)类是一种自定义类型 什么是方法: 方法是实现类功能的一个具体实现,该类有什么样的功能?类的所有功能都要通过调用方法来实现。 自定义类型(类的关键字:class) C中我们学过struct(结构体)自定义类型。c++为了兼容c语言,在这里我们也可以使用struct来定义类。和c不同的是,c++中的struct可以在内部放置函数,除此以

m0_56910081的博客 1万+

十九、帧间预测编码_2、解码、显示顺序与图像管理、参考帧管理

一、基本概念 1.1H.264的解码顺序和显示顺序: 解码过程中,每一帧的数据按照相应的NAL Unit在码流中的顺序传入解码器进行解码 由于B帧的存在,视频帧在输出时会进行顺序重排 1.2frame_num与POC frame_num:表示解码顺序 POC:表示显示顺序(picture_order_count) 在H.264的码流中,表示解码顺序和显示顺序分别有相应的语法元素表示。这两个值都会在码流中保存,并在读取slice信息时解析(SliceHeader中) 1.3参考帧列表 某一帧图像在解

叮咚的博客 1328

<C++>二、 类和对象

C++ learning

ikun66666的博客 308

STM32开发 -- LIS3DH三轴加速度计开发详解

这次要讲一下LIS3DH三轴加速度计的开发使用,之前是有讲过 MPU6050开发 的,但当时是在Linux下做的。额,还是个半成品,哈哈。现在手边有STM32的开发板,可以实实在在的来实现以下卡尔曼滤波了。 一、LIS3DH初识 依照惯例,先看一下手册,大致先了解一下,LIS3DH是什么模块。 下载:LIS3DH datasheet 1、描述 LIS3DH是一款超低功耗高性能三轴线性加速度计,属于...

不积跬步,无以至千里 2万+

从零开始跑通3DGS教程:(五)3DGS训练

本文介绍了在Docker环境中训练3DGS(3D Gaussian Splatting)的方法,属于《从零开始跑通3DGS教程》系列文章的第五部分。主要内容包括:Docker环境准备(基于pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime镜像)、容器内conda环境配置(安装必要依赖和3DGS相关组件)、以及训练命令执行步骤。文章提供了详细的命令行操作流程,帮助读者快速搭建3DGS训练环境。适合在Linux系统、Nvidia GPU环境下使用,完整教程可参考系列文章

诺有缸的高飞鸟的博客 1750

【C++】二 、类和对象总结

== 1.类的6个默认成员函数== 1.1 构造函数主要完成初始化工作 1.2 析构函数主要完成清理工作 1.3 拷贝构造是使用同类对象初始化创建对象 1.4 赋值重载主要是把一个对象赋值给另一个对象 1.5 普通对象取地址 1.6 const对象取地址 == 2.构造函数== 1.构造函数是特殊的成员函数,构造函数的主任务并不是开辟空间创建对象,而是对象的初始化。 其特征如下: 1.函数名与类名...

海的早晨的博客 244

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C++】类和对象(二)

编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。默认成员函数, 我们如果不写,编译器就会自动生成一个但是如果我们实现了任意一个成员函数,编译器就不会会生成了。

一个喜欢猫咪的程序员 1655

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++ 类和对象(二)

类的主要特点之一是数据隐藏和封装,即类的私有成员(或保护成员)只能在类定义的范围内使用,也就是说私有成员只能通过它的成员函数来访问。C++支持两种类型的字符串,第一种是C语言中介绍过的、包括一个结束符’\0’(即以NULL结束)的字符数组,标准库函数提供了一组对其进行操作的函数,可以完成许多常用的字符串操作。当一个类被说明为另一个类的友元类时,它所有的成员函数都成为另一个类的友元函数,这就意味着作为友元类中的所有成员函数都可以访问另一个类中的所有成员。一般而言,静态成员函数不访问类中的非静态成员。

weixin_52222037的博客 1623

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【c++】类和对象(二)this指针

🔥个人主页:Quitecoder🔥专栏:c++笔记仓首先我们定义一个日期类date: 首先思考,这里打印函数,访问的变量是哪里的? 这里访问的是private声明下的吗? 并不是,因为这里只是声明,并没有开辟空间,真正访问的是实例化的d1,d2那么我d1,d2如何找到这两个函数呢?这里就与隐含的指针有关了 可以理解为,编译器处理后处理为上述的样子,调用的地方,编译器也会处理: 它会把调用对象当做形参进行传递 这里我们也能知道,为什么d1访问能打印d1,d2访问能打印d2这个东西我们并不陌生,在前面数

Quietcoder的博客 2295

二、C++类和对象

C++面向对象三大特性包括封装、继承和多态。封装通过类将属性和行为组合,并控制访问权限(public、protected、private)。构造函数初始化对象,析构函数进行清理,拷贝构造函数实现对象复制。浅拷贝直接赋值,深拷贝为指针成员分配新空间。static成员由所有对象共享,const成员函数和对象限制数据修改。友元机制允许外部访问私有成员。这些特性共同构建了C++面向对象编程的核心框架,实现了数据抽象和代码复用。

qq_59762728的博客 616

c++类和对象(二)

内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型。

孤月小透明的博客 1932

C++类和对象(二)

这节才是类和对象的精华,其中有非常多的细节要去进行处理,虽然这块骨头比较难啃,但是还是要硬着头皮去搞懂,迈过类和对象这一关,就为后面的C++学习打下了非常坚实的基础。迈不过,可以说后面的C++基本没得玩了。当然其实还有类和对象三,(狗头),到这里已经差不多85%的内容了吧,类和对象这块确实是个大杂烩,很多很杂,但是走过一段基础打好,后面的学习就会轻松不少

比昨天强一点就好的博客 2619
上一篇: 【C++】类与对象
下一篇: 【C++】构造函数&&析构函数
Tanswer_
博客等级 码龄11年 231粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值