lesson02 类与对象(上)

1.类的定义

2.类的访问限定符及封装

3.类的作用域

4.类的实例化

5.类的对象的大小计算

6.类成员函数的this指针

1.类的定义

class className
{//类体:由成员函数和成员变量组成
};

class是声明类的关键字,className是类的名字,花括号内为类的主体,注意花括号后面有一个分号。

类体中的内容为类的成员:类中的变量称为类的属性成员变量;类中的函数称为类的方法成员函数

成员函数的两种定义方式:

1声明和定义都在类内,需注意:这种方法定义的成员函数可能会被编译器当成内联函数处理。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public://先不管这个publicvoid hello(){cout << "hello world" << endl;}
};
int main()
{stu a1;a1.hello();return 0;
}

2.类内声明,类外定义

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public://先不管这个publicvoid hello();
};
void stu::hello()
{cout << "hello world" << endl;
}
int main()
{stu a1;a1.hello();return 0;
}

3.类声明放在1头文件,成员函数定义在源文件

//name.h
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public://先不管这个publicvoid hello();
};
//name.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "name.h"
void stu::hello()
{cout << "hello world" << endl;
}
//test.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "name.h"
int main()
{stu a1;a1.hello();return 0;
}

2.类的访问限定符及封装

2.1访问限定符

c++实现封装的方式:用类讲对象与方法结合在一起,让对象更加完善,通过访问权限选择性的将接口提供给外部的用户使用。

1.public修饰的成员在类外可以直接访问

2.protect和private修饰的成员在类外不能直接访问(现阶段,protect和private没什么区别),但是在类内可以直接访问

3.访问权限的作用域从该访问限定符开始,直到下一个访问限定符结束。如果后面没有访问限定符了,那就到花括号结束,

4.class的默认访问权限是private。

2.2封装

面向对象的三大特性:封装,继承,多态。

封装:将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象交互。封装的本质上是一种管理,让用户方便使用类。

3.类的作用域

类定义了一个新的作用域,简称类域,类的所有成员都在类的作用域中。在类外定义成员时,需要使用作用域运算符(::)说明成员属于哪个类域。(类内声明,类外定义)

4.类的实例化

用类类型创建对象的过程,叫做类的实例化

1.类是对对象描述,类的声明不占用内存空间

2.一个类可以实例化多个对象,实例化出的对象占用实际的物理空间,存储类的成员变量

3.一个对象只对应着一个类,类和对象是一对多的关系

4.类可以理解成图纸,对象可以被理解成房子,房子占面积,但图纸不占

5.类的对象的大小计算

对象当中不存储成员函数,也不存成员函数的指针,成员函数表实际上存储在公共代码区。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public:void hello(){cout << "hello world" << endl;}
};
int main()
{stu a1;a1.hello();return 0;
}

所以这里的对象a1当中并没有成员函数,实际上这里是根据对象(a1)所对应的类(stu)到公共代码区找成员函数表。

所以,对象中只存成员变量,这里也有内存对齐,规则和结构体一样。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{};
int main()
{cout << sizeof(stu);return 0;
}

空类也有一个字节的大小,用于表示对象的存在。

6.类成员函数的this指针

1.this指针类型:类类型* const,即成员函数中,不能改变this指针

2.this指针只能在成员函数内部使用

3.this指针实质上是成员函数的形参,当对象调用成员函数时自动将对象的指针作为实参传给形参this,所以this也不存在于对象中

4.this指针是隐含的指针形参,不能显式写,但是能显式用

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public:void hello(stu this){cout << "hello world" << endl;}
};
int main()
{stu a1;a1.hello(&a1);return 0;
}

这就叫显式写,是错的。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public:int a;void hello(){this->a = 1;cout << "hello world" << endl;}
};
int main()
{stu a1;a1.hello();return 0;
}

这就叫显式用,是对的。

题目1:这段代码能运行吗?

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public:void print(){cout << "hello" << endl;}
};
int main()
{stu* a1 = nullptr;a1->print();return 0;
}

前面说过,访问成员函数是通过类名到公共代码区找成员函数表而访问的,并不是通过对象访问的,所以这里的a1虽然是空指针,但并没有对其解引用!

将空指针传给this,只要不通过this访问成员变量就不会出错!

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public:void printa(){cout << "a" << endl;}void print(){this->printa();cout << "hello" << endl;}
};
int main()
{stu* a1 = nullptr;a1->print();return 0;
}

同理,这个也是对的,这里的this是对象的地址,访问成员函数不会由对对象指针的解引用

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stu
{
public:int a;void print(){this->a = 1;cout << "hello" << endl;}
};
int main()
{stu* a1 = nullptr;a1->print();return 0;
}

这里就会运行崩溃了(不是编译错误!!!),因为这里通过this访问成员变量,存在对空指针的解引用!!!

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

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

相关文章

JVM修炼之路【12】- GC调优 、性能调优

上一篇中 我们详细讲了内存溢出 内存泄漏 还有相关的案例。 这篇博客中我们主要了解一下GC调优。 有些新手可能会有一点 疑问—— 这两者不是一回事吗&#xff1f;&#xff1f; 其实说一回事 也没错 因为GC调优本质上还是针对 堆上的内存 只不过前面我们关注的侧重点在于 不合…

软件设计师——软件工程基础知识

软件工程基础知识 软件过程软件过程模型软件测试方法进度管理软件复杂性度量环路复杂度耦合聚合和组合 软件过程 软件过程模型 软件测试方法 黑盒测试和白盒测试 白盒测试中&#xff0c;语句覆盖对程序执行逻辑的覆盖很低&#xff0c;因此一般认为它是很弱的逻辑覆盖。 进度管…

Golang 为什么要使用接口

接口的存在本质上是为了抽象化&#xff0c;这里理解的重点是&#xff1a; 一个类型如果拥有一个接口需要的所有方法&#xff0c;那么这个类型就实现了这个接口 这说明接口一个很重要的特点就是抽象&#xff0c;把不同类型的相同特点进行抽象统一。 下面举一个例子&#xff0…

dfslieti

oibh 总部突然被水淹没了&#xff01;现在需要你的救援…… 题目描述 oibh 被突来的洪水淹没了&#xff0c;还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示&#xff0c;而一个四面被围墙围住的区域洪水是进不去的。 oibh 总部内部也有许多重要区域&#xff0c;每个…

NCC常见的问题

NCC常见的问题 问题一 问题 前端界面节点打开报错&#xff0c;界面显示Cannot GET /xxx/xxx/xxx/main/index.html 解决方法 前端工程config.json里面没有配置对应节点的路径。把"./src/xxx/xxx/xxx/main/index.js"路径配置到config.json文件的buildEntryPath里面&am…

AcWing 898 数字三角形

给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的数字的和最大。 73 88 1 02 7 4 4 4 5 2 6 …

Kylin使用心得

一、初识Kylin 什么是Apache Kylin&#xff1f; Apache Kylin&#xff0c;中文名“凯林”&#xff0c;是一款专为大数据量设计的OLAP&#xff08;在线分析处理&#xff09;引擎。简单来说&#xff0c;它就像一个超级数据分析师&#xff0c;能帮助你快速、准确地从海量数据中提…

【Django开发】0到1美多商城项目md教程第7篇:登录,1. 互联开发者申请步骤【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

HarmonyOS实战开发-自定义分享

介绍 自定义分享主要是发送方将文本&#xff0c;链接&#xff0c;图片三种类型分享给三方应用,同时能够在三方应用中展示。本示例使用数据请求 实现网络资源的获取&#xff0c;使用屏幕截屏 实现屏幕的截取&#xff0c;使用文件管理 实现对文件&#xff0c;文件目录的管理&…

地球上的七大洲介绍

地球上的七大洲示意图&#xff1a; 1. 亚洲&#xff08;Asia&#xff09;&#xff1a;世界上最大的洲&#xff0c;面积约为44579000平方公里。亚洲地域辽阔&#xff0c;包括从北极圈到赤道的各种气候和地形。它拥有世界上最多的人口&#xff0c;也是世界上一些最古老文明的发源…

transformer上手(4) —— 模型与分词器

1 模型 除了像之前使用 AutoModel 根据 checkpoint 自动加载模型以外&#xff0c;我们也可以直接使用模型对应的 Model 类&#xff0c;例如 BERT 对应的就是 BertModel&#xff1a; from transformers import BertModel model BertModel.from_pretrained("bert-base-ca…

28、链表-两数相加

思路&#xff1a; 有几个方面需要考虑 双指针遍历&#xff0c;如果出现和大于10那么向前进1如果长度不一样那么长的部分直接落下并且考虑进1 的问题 代码如下&#xff1a; class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {if (l1null||l2null){…

【40分钟速成智能风控14】数据处理和特征工程

目录 智能模型数据处理 重复值处理 一致性检验 数据交叉验证 线上线下验证 有效性检验 业务经验 数据分析 特征工程和特征筛选 探索性数据分析 字符型特征 缺失率过高 类别过少 异常值处理 智能模型数据处理 重复值处理 保证数据的唯一性也是数据清洗过程中需要…

python 动态规划 最长回文子串

给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 #我们用 P(i,j) 表示字符串 s 的第 i 到 j个字母组成的串&#xff08;下文表示成 s[i:j]&#xff09;是否为回文串&#xff1a; #也就是说…

金融机构与金融市场监管

金融机构与金融市场监管 中国的金融监管机构银行业监管的必要性银行业监管的基本目标银行业监管的基本内容商业银行的设立审批制度银行业日常监督管理流动性要求资产质量监管合理的内部控制制度风险集中和风险暴漏的监管银行资本风险资本的计算资本充足率的计算 中国的金融监管…

Hadoop+Spark大数据技术(微课版)曾国荪、曹洁版思维导图第四次作业 (第4章 HBase分布式DB)

1.简述Hbase的特点及与传统关系数据库的区别 HBase与传统关系数据库的区别 &#xff08;1&#xff09;数据类型 关系数据库具有丰富的数据类型&#xff0c;如字符串型、数值型、日期型、二进制型等。HBase只有字符串数据类型&#xff0c;数据的实际类型都是交由用户自己编写程序…

贡献者契约行为准则

文章目录 要点文献 要点 准则而已 文献 https://www.kernel.org/doc/html/latest/translations/zh_CN/process/code-of-conduct.html https://www.kernel.org/doc/html/latest/translations/zh_CN/process/code-of-conduct-interpretation.html#cn-code-of-conduct-interpre…

【JSON2WEB】14 基于Amis的CRUD开发30分钟速成

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

【springCloud】版本学习

Spring Cloud介绍 官网地址&#xff1a;https://spring.io/projects/spring-cloud Spring Cloud 是一个基于 Spring Boot 的微服务架构解决方案&#xff0c;它提供了一系列工具和模式来帮助开发者构建分布式系统。Spring Cloud 的组件和模式包括配置管理、服务发现、断路器、…

1028: 特定字符序列的判断

解法&#xff1a; #include<iostream> #include<stack> using namespace std; int main() {stack<char> sk;char c;bool flag false;while (cin >> c) {if (c #) break;if (c ) {flag true;continue;}if (flag) {if (sk.top() c) {sk.pop();cont…