当前位置: 首页 > news >正文

C++工程实战入门笔记10-面向对象之静态成员变量和成员函数、构造函数和析构函数

静态成员变量

静态成员变量在类中声明,在类外定义和初始化。它们被所有类的对象共享。

例如:static int size; 在类外定义为 int MyClass::size{0};

静态成员函数

静态成员函数不能访问非静态成员变量(因为没有this指针),只能访问静态成员变量和调用其他静态成员函数。

例如:static void TestStatic();

注:每个非静态成员函数都有一个指向当前对象的this指针

class MyClass
{
public://成员变量int x{ 0 };//C++11开始可以在声明时赋初值int y{ 0 };char name[16]{ "myclass name" };void TestIn(int v)//内联函数{//普通成员函数可以访问私有的静态成员变量count++;cout << "count = " << count << endl;//this指针:当前类对象的地址cout << "this addr = " << (long long)this << endl;x += v;y += v;cout <<"inline: "<< x << ":" << y << endl;cout << "this-: " << this->name << endl;this->Test(20);cout << name << endl;}void Test(int v);//普通函数,非内联函数,声明和定义是分开的,此处的声明,定义见下方函数 MyClass::Test(int v)// 静态成员变量声明static int size;//静态成员函数static void TestStatic(){//没有this指针 不能访问非静态成员变量count++;//可以访问静态成员变量 private: static int count;cout << "test static" << endl;//x++;不可以访问非静态成员变量 public: int x{ 0 };}//静态成员函数应用场景1:单件模式 类的对象只存在一份static MyClass& Instance(){static MyClass mc;//静态局部变量return mc;}//静态成员函数应用场景2:成员函数封装成普通函数static void RunStatic(MyClass& obj){obj.Run();}private: //私有,只有(静态)成员函数可以访问static int count;void Run() { cout << "MyClass Run" << endl; }};//以上都是放到.h头文件中
// 静态成员变量定义
int MyClass::size{ 0 };
int MyClass::count{ 0 };void MyClass::Test(int v)
{x += v;y += v;cout << "no-inline: " << x << ":" << y << endl;cout << name << endl;
}int main()
{MyClass mc;MyClass::size++;cout << "MyClass::size = " << MyClass::size << endl;//MyClass::count++;//MyClass::TestStatic();MyClass::Instance().Test(100);MyClass::RunStatic(mc);system("pause");}  

全局对象和静态局部对象的构造和析构时机

构造函数

与类同名,无返回类型,用于初始化对象。在对象创建时自动调用。

析构函数

类名前加~,无参数无返回类型,用于清理资源。在对象销毁时自动调用。

  • 全局对象mcg在main函数开始之前构造(在程序启动时),在main函数结束后析构(程序结束时)。
  • 静态局部对象mcs在第一次执行到其声明时构造,在main函数结束后(程序结束时)析构。
  • 局部对象mc1和mc2在进入它们定义的代码块时构造,在离开代码块时析构(以相反的顺序)。
  • 构造函数和析构函数的定义与调用
#include<iostream>
using namespace std;class  MyClass
{
public://构造函数 函数名是类名MyClass(){cout << "create myclass..." << endl;}~MyClass()//析构函数{cout << "drop myclass" << endl;}
};//MyClass:: MyClass()MyClass mcg;//全局对象 构造在main之前调用int main()
{cout << "begin main" << endl;static MyClass mcs;//静态局部 构造第一次执行{MyClass mc1;//调用MyClass构造函数MyClass mc2;getchar();//此时不调用析构函数}cout << "按任意键结束程序,此时静态对象将被销毁..." << endl;getchar(); //此时调用了析构函数--》出了作用域 调用栈区对象的析构system("pause");
}   

空指针的使用

使用nullptr(C++11引入)表示空指针,比NULL更安全
释放指针后将其设置为nullptr是良好的编程习惯,可防止悬空指针

MyClass* mcp1 = new MyClass(); // 在堆上创建对象
delete mcp1; // 释放内存并调用析构函数
mcp1 = nullptr; // 指针清空用nullptr
http://www.xdnf.cn/news/1452457.html

相关文章:

  • 【C++设计模式】第二篇:策略模式(Strategy)--从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
  • 联软科技:以“韧性安全”守护数字世界,致敬抗战胜利80周年的坚韧精神
  • vite与webpack对比
  • ATT层MTU大小
  • 【工具变量】数林指数数据集(2017-2024年)
  • 力扣654:最大二叉树
  • 51单片机-按键、蜂鸣器、定时器模块及中断
  • 大文件断点续传解决方案:基于Vue 2与Spring Boot的完整实现
  • C++并发编程-23. 线程间切分任务的方法
  • `void 0` 与 `undefined` 深度解析
  • mysql安装(压缩包方式8.0及以上)
  • 2026届IC秋招联芸科技IC面经(完整面试题)
  • 从零开始学大模型之大语言模型
  • 大模型部署全攻略:Docker+FastAPI+Nginx搭建高可用AI服务
  • MindMeister AI版:AI思维导图工具高效生成框架,解决结构卡壳与逻辑优化难题
  • 十一、容器化 vs 虚拟化-K8s-Kustomize
  • Spark中的堆外和堆内内存以及内部行数据表示UnsafeRow
  • S 3.3深度学习--卷积神经网络--代码
  • (A题|烟幕干扰弹的投放策略)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
  • 【mmcv自己理解】
  • “全结构化录入+牙位可视化标记”人工智能化python编程路径探析
  • 新电脑硬盘如何分区?3个必知技巧避免“空间浪费症”!
  • 如何监控员工的电脑?7款实用的员工电脑管理软件,探索高效管理捷径!
  • cursor+python轻松实现电脑监控
  • 【嵌入式DIY实例-ESP32篇】-倾斜弹跳球游戏
  • 小程序缓存数据字典
  • Android 项目:画图白板APP开发(三)——笔锋(多 Path 叠加)
  • 当液态玻璃计划遭遇反叛者:一场 iOS 26 界面的暗战
  • 用 Rust + Actix-Web 打造“Hello, WebSocket!”——从握手到回声,只需 50 行代码
  • Energy期刊论文学习——基于集成学习模型的多源域迁移学习方法用于小样本实车数据锂离子电池SOC估计