C++复习 -- 常用关键字


this 关键字:

概念


在 C++ 中, this 关键字是一个指向调用对象的指针。它在成员函数内部使用,用于引用调用该函数的对象。使用 this 可以明确指出成员函数正在操作的是哪个对象的数据成员。

=========


case :证明他就是一个指向被调用对象的指针:

#include <iostream>
#include <string>
using namespace std;class Car {
private:
string brand;
int year;
public:
Car(string bb,int yy){
cout<<"构造函数里面:"<<endl;
cout<<this<<endl;
}};int main()
{
Car c1("mmx",1999);
cout<<&c1<<endl;return 0;
}


------------------------------------

case2 -- 体现this的应用


应用1: 进行构造初始化的时候 ,传入参数和实际变量重名 --   加上this 关键字修饰,避免歧义
应用2 -- 返回当前对象的引用:

// 返回引用 -- 方便 进行链式调用:

#include <iostream>
#include <string>
using namespace std;class Car {
private:
string brand;
int year;
public:
Car(string brand,int year){
//cout<<"构造函数里面:"<<endl;
//cout<<this<<endl;
this->brand = brand;
this->year = year;
}
void display() const {
cout << "Brand: " << this->brand << ", Year: " << this->year << endl;
// 也可以不使用 this->,直接写 brand 和 year
}
Car& setYear(int year){this ->year =year; //修改年份return *this; // 返回被调用对象的引用
}};int main()
{
Car c1("mmx",1999);
c1.display();
//链式调用:
c1.setYear(2003).display();return 0;
}

在这个例子中, Car 类的构造函数使用 this 指针来区分成员变量和构造函数参数。同样, setYear
成员函数使用 this 指针来返回调用该函数的对象的引用,这允许链式调用,如
myCar.setYear(2021).display(); 。在 main 函数中创建了 Car 类型的对象,并展示了如何使用这
些成员函数。

======================================================

new 关键字:

概念:

new 关键字用于动态分配内存。它是C++中处理动态内存分配的主要工具之一,允许在程序运
行时根据需要分配内存。

基本用法


分配单个对象:使用 new 可以在动态分配一个对象。例如, new int 会分配一个 int 类型的空
间,并返回一个指向该空间的指针。
分配对象数组: new 也可以用来分配一个对象数组。例如, new int[10] 会分配一个包含10个整数的数组。
初始化:可以在 new 表达式中使用初始化。对于单个对象,可以使用构造函数的参数:

与 delete 配对使用
使用 new 分配的内存必须显式地通过 delete (对于单个对象)或 delete[] (对于数组)来释放,以
避免内存泄露:
释放单个对象:
释放数组:


注意事项


异常安全:如果 new 分配内存失败,它会抛出 std::bad_alloc 异常(除非使用了 nothrow 版
本)。
内存泄露:忘记释放使用 new 分配的内存会导致内存泄露。
匹配使用 delete 和 delete[] :为避免未定义行为,使用 new 分配的单个对象应该使用
delete 释放,使用 new[] 分配的数组应该使用 delete[] 释放。


示例代码


int* ptr = new int; //C语言中,int *p = (int *)malloc(sizeof(int));
int* arr = new int[10]; //C语言中,int *arr = (int *)malloc(sizeof(int)*10);
MyClass* obj = new MyClass(arg1, arg2);
delete ptr; // 释放 ptr 指向的对象
delete[] arr; // 释放 arr 指向的数组

case

class MyClass {
public:
MyClass() {
std::cout << "Object created" << std::endl;
}
};
int main() {
// 分配单个对象
MyClass* myObject = new MyClass();
// 分配对象数组
int* myArray = new int[5]{1, 2, 3, 4, 5};
// 使用对象和数组...
// 释放内存
delete myObject;
delete[] myArray;
return 0;
}

在这个例子中, new 被用来分配一个 MyClass 类型的对象和一个整数数组,然后使用 delete 和
delete[] 来释放内存。每个 new 都对应一个 delete ,保证了动态分配的内存被适当管理。


=========================================================


静态成员  -- static 关键字:

概念

静态成员在C++类中是一个重要的概念,它包括静态成员变量和静态成员函数。

静态成员的特点和存在的意义:


静态成员变量


1. 定义:静态成员变量是类的所有对象共享的变量。与普通成员变量相比,无论创建了多少个类的实例,静态成员变量只有一份拷贝
2. 初始化:静态成员变量需要在类外进行初始化,通常在类的实现文件中。
3. 访问:静态成员变量可以通过类名直接访问,不需要创建类的对象。也可以通过类的对象访问。
4. 用途:常用于存储类级别的信息(例如,计数类的实例数量)或全局数据需要被类的所有实例共
享。


静态成员函数


1. 定义:静态成员函数是可以不依赖于类的实例而被调用的函数。它不能访问类非静态成员变量和非静态成员函数。
2. 访问:类似于静态成员变量,静态成员函数可以通过类名直接调用,也可以通过类的实例调用。
3. 用途:常用于实现与具体对象无关的功能,或访问静态成员变量。

=====================================================


case1: 基本使用:

#include <iostream>using namespace  std;class Test{
public:
void printInfo();
};class Myclass{
public:int datas;static int staticValue;void printInfo(){cout<<datas<<endl;}static  int getStaticValue(){//   datas =10; //不能 操作非静态成员变量 -->因为静态成员函数先于他们实现,这里的datas相当于还没定义return staticValue;}};
int Myclass:: staticValue=1000;
void Test::printInfo()
{Myclass:: staticValue++;cout <<"Test 打印:"<<endl;cout<<Myclass::getStaticValue()<<endl; //静态成员函数能被其他成员和类调用
}int main()
{Test t;cout<<Myclass::staticValue<<endl;
cout<<Myclass::getStaticValue()<<endl;t.printInfo();return  0;
}

=============================================

case2: 基本应用


 

#include <iostream>using namespace std;class Myclass{
public:static int staticNumofInstance;Myclass(){staticNumofInstance++;}~Myclass(){staticNumofInstance--;}static  int getStaticValue(){//   datas =10; //不能 操作非静态成员变量 -->因为静态成员函数先于他们实现,这里的datas相当于还没定义return staticNumofInstance;}};
int Myclass::staticNumofInstance=0;int main()
{Myclass m1;cout  <<Myclass::getStaticValue()  << endl;{// 规定了m2,m3的作用域,出作用域就被析构Myclass m2;cout <<Myclass::getStaticValue()  << endl;Myclass m3;cout <<Myclass::getStaticValue()  << endl;}Myclass m4;cout <<Myclass::getStaticValue()  << endl;Myclass *m5=new Myclass;
cout <<Myclass::getStaticValue()  << endl;delete m5;
cout <<Myclass::getStaticValue()  << endl;return 0;
}

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

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

相关文章

Linux内核发送网络数据

前言 我们开始今天对 Linux 内核⽹络发送过程的深度剖析。还是按照我们之前的传统&#xff0c;先从⼀段代码作为切⼊。 上述代码中&#xff0c;调⽤ send 之后内核是怎么样把数据包发送出去的。本⽂基于Linux 3.10&#xff0c;⽹卡驱动采⽤Intel的igb举例。 基础框架 我们看…

【多人协作】场景模拟(一)

文章目录 实现多人协作场景&#xff1a;操作流程1开发人员a和b克隆仓库到本地2在本地仓库建立分支并与远程分支建立链接3开发人员工作并提交代码4将合并dev分支与master分支 实现多人协作 多人协作开发是git的最核心也是最重要的操作。多人协作也就意味着同一时间里&#xff0…

前端已死? Bootstrap--CSS组件

目录 Bootstrap 下载 Bootstrap--全局CSS样式 栅格系统 栅格参数 正常显示 实例 代码演示: 排版 代码演示 表格 代码演示 表单 代码演示 等等...(文档很清晰了) Bootstrap--组件 结合演示:(页面) Bootstrap Bootstrap v3 中文文档 Bootstrap 是最受欢迎的 HT…

(三)Spring教程——依赖注入与控制反转

Spring框架是为了简化企业级应用开发而创建的&#xff0c;其强大之处在于对Java SE和Java EE开发进行全方位的简化&#xff0c;Spring还对常用的功能进行封装&#xff0c;可以极大地提高Java EE的开发效率。 依赖注入是Spring的核心技术之一&#xff0c;也被称为“控制反转”&a…

每日两题 / 437. 路径总和 III 105. 从前序与中序遍历序列构造二叉树(LeetCode热题100)

437. 路径总和 III - 力扣&#xff08;LeetCode&#xff09; 前序遍历时&#xff0c;维护当前路径&#xff08;根节点开始&#xff09;的路径和&#xff0c;同时记录路径上每个节点的路径和 假设当前路径和为cur&#xff0c;那么ans 路径和(cur - target)的出现次数 /*** D…

RAG 面向 LLM: 基于检索增强的大语言模型调研

摘要 作为 AI 领域最先进的技术之一,检索增强生成(RAG)技术可以提供可靠和最新的外部知识,为众多任务提供巨大的便利。特别是在 AI 生成内容(AIGC)时代,RAG 中检索强大的提供额外知识的能力使得检索增强生成能够辅助现有生成式 AI 生产高质量输出。最近,大语言模型(LLM)在语言…

110份财务常用excel模板(个税、采购、报销、预算),超实用!

如果你还在为报表头疼&#xff0c;那你一定不能错过这篇干货满满的分享&#xff01; 个税报表 个人所得税&#xff0c;听起来就头大&#xff1f;别担心&#xff0c;掌握这些技巧&#xff0c;轻松搞定&#xff01; - 记录员工收入&#xff0c;确保数据准确无误 - 计算应纳税…

达梦sql中参数个数太多导致出现SOH等特殊字符报错无效的序列号是不是达梦的bug

mybatis的Mapper.xml中如下&#xff1a; in中的参数大概有1万6千多个&#xff0c;分成每1000个一组拼接成sql&#xff0c;然而在达梦中执行时报如下: Caused by: dm.jdbc.driver.DMException: Invalid sequence noat dm.jdbc.driver.DBError.throwException(DBError.java:710)…

【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库

今天是第七专题&#xff0c;主要内容是&#xff1a;导入ArduinoUZlib功能库&#xff0c;借助该库把从【和风天气】官网返回的经过Gzip压缩的JSON数据&#xff0c;进行解压缩和t解析&#xff0c;在串口监视器上输出解析后的JSON信息。 如您需要了解其它专题的内容&#xff0c;请…

C++面向对象程序设计-北京大学-郭炜【课程笔记(八)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;八&#xff09;】 1、虚函数和多态的基本概念1.1、虚函数1.2、多态多态的表现形式一多态的表现形式二 2、多态实例&#xff1a;魔法门之英雄无敌2.1、**非多态的实现方法&#xff1a;**2.2、**多态的实现方法** 3、多态实…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发&#xff1a;控制器、模型、视图、JS一一对应&#xff0c;使用RequireJS进行插件机制&#xff0c;支持插…

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…