c++入门语法————初识类和对象

文章目录

  • 一、类的定义
    • 1. 声明和定义全部放在类体中
    • 2.声明和定义分离
  • 二、类的访问限定符及封装
  • 三、类的实例化
  • 四、 类对象的存储方式
  • 五.this指针
    • 1.简单应用
    • 2、问题思考

一、类的定义

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

在c语言中,仅支持的自定义类型为struct,且结构体成员仅为数据变量。
在c++在保留了,struct且拓展了class,结构体内不仅可以定义变量,也可以定义函数。
类的两种定义方式:

1. 声明和定义全部放在类体中

需注意:成员函数如果在类中定义,编译器可能会将其当成内
联函数处理。

class person {
public:void ShowInfo(){cout <<_name<<_sex<<_age << endl;}
public:char* _name;char* _sex;int   _age;
};

2.声明和定义分离

注意:成员函数名前需要加类名::
头文件:

class person {
public:void ShowInfo();
public:char* _name;char* _sex;int   _age;
};

源文件

void person::ShowInfo()
{
cout <<_name<<_sex<<_age << endl;
}

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

二、类的访问限定符及封装

在这里插入图片描述

【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  3. 如果后面没有访问限定符,作用域就到 } 即类结束。
  4. class的默认访问权限为private,struct为public(因为struct要兼容C)

三、类的实例化

类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

int main()
{Person._age = 100;   // 编译失败:error C2059: 语法错误:“.”return 0;
}

如上所示:erson类是没有空间的,只有Person类实例化出的对象才有具体的年龄。

在这里插入图片描述

四、 类对象的存储方式

按照类的形式应该将将成员函数的地址和成员变量都存在对象中
在这里插入图片描述
但是 存在问题:调的成员函数都是一样的,所以没必要都每个对象都存一个成员函数的地址。造成内存浪费。
所以在实践中为了节约空间将成员函数放在公共代码区,使用时直接调用,每个对象的成员函数地址都是相同的。‘
在这里插入图片描述

五.this指针

1.简单应用

在C++中,this指针是一个隐含的指向当前对象的指针,它是每个非静态成员函数的一个隐含参数。
通俗的说就是成员函数中的对象,会默认传入函数中,在一个类中可直接调用无需单独传参。
在这里插入图片描述
他有如下特点:

1.this指针是一个指向当前对象的指针,它指向调用该成员函数的对象。
2.this指针是一个常量指针,不能被修改。
3.this指针在每个非静态成员函数中都是可用的,它指向调用该成员函数的对象

用法:

1.在成员函数中可以使用this指针来访问对象的成员变量和成员函数,
以区分局部变量和成员变量同名的情况。
2.可以通过this指针返回对象本身,从而支持链式调用。
3。可以在类的成员函数中将this指针作为参数传递给其他函数,
以便在其他函数中访问当前对象。

2、问题思考

  • this指针储存在哪里?
    在C++中,this指针并不是实际存储在对象中的成员变量中,而是在编译器内部进行处理的。当调用一个成员函数时,编译器会将对象的地址作为隐含的参数传递给成员函数,并将该地址赋给this指针。因此,this指针并不占用对象的内存空间,它只是一个指向调用该成员函数的对象的指针。
    所以显然存储在编译器中栈的位置,某些编译器会直接放在寄存器中,使得高效编译
  • 以下两个程序运行时分别是什么结果?
    Question1:
class test1 {
public:void print(){cout << "print()" << endl;}
private:int a = 100;
};
int main()
{test1* t1=nullptr;t1->print();return 0;
}

Question 2:

class test2 {
public:void print(){a = 2024;cout << a << endl;}
private:int a = 100;
};
int main()
{test2* t2=nullptr;t2->print();return 0;
}

这两个程序的区别在通过空指针调用函数时是否访问了成员变量,
看似都犯了对空指针解引用的操作错误,实则,底层调用函数时并不需要解引用而是去之前我们提到的公共代码区,所以test1运行正常,而test2由于使用了this指针去调用成员变量则会运行崩溃
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

C++入门全集(5):内存管理

前言 一、内存区域划分 二、C的内存管理方式 2.1 对内置类型 2.2 对自定义类型 三、new和delete的底层实现 四、new和delete的原理 五、定位new 六、malloc/free和new/delete 前言 在C中&#xff0c;内存管理是不可避免的一门必修课。C对内存的自由度使其获得了更高的…

DA14531在三星手机手写笔的应用让我打开眼镜

手写笔的功能 这是一款内置蓝牙功能的魔性笔&#xff0c;它是遥控器、是照相、切换摄像头、是暂停或者打开播放列表。乃至更多操作-通过不同的手势隔空操作&#xff0c;或者按下触控按键便可轻松搞定。 手写笔硬件设计 内部结构 采用2.3V可循环充电电池&#xff0c;放入手…

【CSP试题回顾】202212-2-训练计划

CSP-202212-2-训练计划 解题思路 输入和初始化&#xff1a; 首先&#xff0c;代码从输入中获取项目的截止日期和项目数量。然后&#xff0c;它初始化一个项目列表&#xff0c;每个项目都有其依赖项、被依赖的项目集合、完成时间、总完成时间&#xff08;包括依赖链&#xff09…

@RequestBody

目录 概述 深入细节 案例 RequestBody与前端传过来的json数据的匹配规则 指定模型中的属性对应什么key 用Valid校验RequestBody的参数 根据RequestBody的内容来区分使用哪个资源 概述 RequestBody主要用来接收前端传递给后端的json字符串中的数据(请求体中的数据)而最常…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:多态样式)

设置组件不同状态下的样式。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 从API Version 11开始支持另一种写法attributeModifier&#xff0c;可根据开发者需要动态设置属性。 stateStyles stateStyl…

【深度学习笔记】5_8 网络中的网络NiN

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.8 网络中的网络&#xff08;NiN&#xff09; 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的…

STL容器之map和set的补充AVL树

一、AVL树 ​ 不同搜索的对比&#xff1a;1.暴力搜索时间复杂度是O(N)&#xff1b;2.二分查找的时间复杂度是O(lgN)&#xff0c;但是伴随着有序&#xff0c;插入删除挪动数据的成本极高&#xff1b;3.二叉搜索的时间复杂度是高度次数&#xff0c;极端场景会退化为类似链表时间…

MySQL 主从同步模式

MySQL主从同步是一种数据库复制技术&#xff0c;其中一个MySQL数据库服务器&#xff08;主服务器&#xff09;上的更改会被自动地传播到一个或多个其他数据库服务器&#xff08;从服务器&#xff09;。这有助于提高系统的可伸缩性、可用性和容错性。以下是设置MySQL主从同步的基…

网络编程的学习

思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…

BUUCTF-MISC1

二维码1 1.打开附件 得到一个二维码 2. 查看 拉到kali用binwalk查看 3.文件分离 发现图片中含有压缩包文件 用binwalk -e 文件名 &#xff0c;进行文件分离 得到一个分离后的文件夹 点开&#xff0c;发现是一个压缩包&#xff0c;压缩包中含有加密文档 4.破解密码 用ARCH…

CSS3新特性

简介 继CSS2之后&#xff0c;CSS3增加了很多新的特性&#xff0c;虽然W3C仍在规范中&#xff0c;但是很多新的CSS3属性已经在很多现代浏览器中得到了支持。 CSS3边框 在CSS3中&#xff0c;可以创建圆角边框&#xff0c;添加边框阴影&#xff0c;设置边框图片&#xff0c;利用…

市场复盘总结 20240305

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 25% 最常用的…