C++语法—类的声明和定义

news/2025/10/28 12:06:39/文章来源:https://www.cnblogs.com/jfp1/p/19171462

一、 类的声明和定义

class 类名
{public:数据成员的声明成员函数的声明private:数据成员的声明成员函数的声明protected:数据成员的声明成员函数的声明
}

自生类的对象不可以作为该类的成员,但自生类的指针或引用可以作为该类的成员。

1.1 构造函数和析构函数

如果在构造函数中new 出了空间,需要在析构函数中 进行释放。

案例:

Person.h

#include <iostream>
#include <string.h>
using namespace std;
class CPerson
{public:CPerson();~CPerson();//析构函数char* m_pMessage;void ShowStartMessage();void ShowFrameMessage();
};
CPerson::CPerson()
{m_pMessage = new char[2048];
}
void CPerson::ShowStartMessage()
{strcpy(m_pMessage,"Welcome to MR");cout << m_pMessage << endl;
}
void CPerson::ShowFrameMessage()
{strcpy(m_pMessage,"**************");cout << m_pMessage << endl;
}
CPerson::~CPerson()
{delete[] m_pMessage;
}
 
 

main.cpp

#include <iostream>
using namespace std;
#include "Person.h"
void main()
{CPerson p;p.ShowFrameMessage();p.ShowStartMessage();p.ShowFrameMessage();
}
 
 

一个类中只能定义一个析构函数

析构函数不能重载

构造函数和析构函数不能使用return语句返回值,所以不需要添加返回值类型, 例如 void 等。

1.2 类成员修饰符

public 对内可见,对外可见,且对派生类可见

protected 对内可见,对外不可见,且对派生类可见

private 对内可见,对外不可见,对派生类不可见

如果在类定义中没有加任何的关键字,则默认状态下类成员都位于private区域

1.3 内联成员函数

在类成员函数前加 inline ,如果在类内部不加 inline ,默认也是认为是内联函数

class cBook
{inline void test();
}//还可以  不在类内加,而在类外加
class cBook
{void test();
}
inline void cBook::test()
{}
 
 

1.4 类成员函数添加const

类成员函数 括号 () 后添加 const 表示该函数方法不会修改成员变量,如果该方法修改了,编译会报错,保证了程序的健壮性

#include <iostream>
using namespace std;
int a=10;
class Test{int a;public :int test () const{//a++;cout << a <<endl;cout << "hello"<<endl;geta();return a;}int geta() const{return 2;}
};void main(){Test test;test.test();
}
 
 

1.5 静态类成员static

用static修饰的成员函数和成员变量可以直接通过类名访问

静态成员变量需要在类外进行初始化

静态成员函数 只能调用 静态成员变量。

对于静态类成员,需要注意以下几点:

(1) 静态类成员类型 可以是当下的 定义的类类型

class cBook
{public:static cBook s_book;        //正确//cBook books;         不是静态类型不能定义自己这个类型cBook * p_book;            //但是可以定义自己类型的指针
}
 
 

(2) 静态类成员可以作为成员函数的默认参数,普通类成员不行

class cBook
{public:int price;static int s_price;//void test(int data=price);    错误void test(int data=s_price);    //正确
}
 
 

(3) 定义静态成员函数时不能添加 const 修饰

//static void test() const;   错误
 
 

(4) 静态成员函数如果是在类外实现,不能添加static

class cBook
{static int price;static void test();
}static void cBook::test()        //错误
{cout<< price <<endl;
}void cBook::test()        //正确
{cout<< price <<endl;
}
 
 

1.6 嵌套类

类如果想要访问嵌套类的私有成员,需要在嵌套类中将外部类作为友元类。

如果想要定义嵌套类,需要在嵌套类前面添加外部类的作用域,如:

int main(int argc,char *argv[])
{CList::CNode node;return 0;
}

1.7 局部类

局部类就是在函数内定义的类,与正常的类没啥区别

1.8 友元

使用friend关键字让特定的函数或别的类的所有成员函数对私有数据成员进行读写,这既可以保持数据的私有性,又能够使特定的类或函数直接访问私有数据。

友元类:

#include <iostream>
using namespace std;
class CItem
{private:char m_Name[128];void OutputName(){printf("%s\n",m_Name);}
public:friend class CList;void setItemName(const char * pchData){if(pchData!=NULL){strcpy(m_Name,pchData);}}CItem(){memset(m_Name,0,128);}};class CList
{private:CItem m_Item;
public:void OutputItem();
};void CList::OutputItem()
{m_Item.setItemName("bejin");m_Item.OutputName();
}void main()
{CList clist;clist.OutputItem();
}

友元函数:

全局函数也能做友元函数,这里的案例是成员函数做友元函数

#include <iostream>
class CItem;                                //前导声明CItem类
class CList                                //定义CList类
{private:CItem * m_pItem;                        //定义私有数据成员m_pItem
public:CList();                                //定义默认构造函数~CList();                                //定义析构函数void OutputItem();                        //定义OutputItem成员函数
};
class CItem                                //定义CItem类
{friend void CList::OutputItem();                //声明友元函数
private:char m_Name[128];                        //定义私有数据成员void OutputName()                        //定义私有成员函数{printf("%s\n",m_Name);                //输出数据成员信息}
public:void SetItemName(const char* pchData)        //定义共有方法{if (pchData != NULL)                    //判断指针是否为空{strcpy(m_Name,pchData);        //赋值字符串}}CItem()                                //构造函数{memset(m_Name,0,128);                //初始化数据成员m_Name}
};
void CList::OutputItem()                        //CList类的OutputItem成员函数的实现
{m_pItem->SetItemName("BeiJing");            //调用CItem类的共有方法m_pItem->OutputName();                //在友元函数中访问CItem类的私有方法OutputName
}
CList::CList()                                //CList类的默认构造函数
{m_pItem = new CItem();                    //构造m_pItem对象
}
CList::~CList()                                //CList类的析构函数
{delete m_pItem;                        //释放m_pItem对象m_pItem = NULL;                        //将m_pItem对象设置为空
}
int main(int argc, char* argv[])                    //主函数
{CList list;                                //定义CList对象listlist.OutputItem();                        //调用CList的OutputItem方法return 0;
}

1.9 命名空间

命名空间是用来消除命名冲突的最佳方式

namespace MyName
{int iInt1 = 10;int iInt2 = 20;
};//使用命名空间的成员
MyName::iInt1 = 30;

1.9.1 嵌套命名空间

命名空间里面再来一个命名空间,用法类似。

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

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

相关文章

施工用电隐患 “无形侦探”!思通数科 AI 卫士自动排查用电违规

施工用电是施工现场安全管理的 “重中之重”,但传统人工巡检模式常因 “专业性要求高、隐患隐蔽性强” 陷入困境:电缆泡水、电线私拉乱接(如直接缠绕钢管、未穿管保护)等隐患,藏在设备角落或地面杂物下,人工难以…

基于C#的停车场管理系统实现

一、系统架构设计 // 核心类结构设计 public class ParkingSystem {private ParkingLot _parkingLot; // 停车场实体private VehicleManager _vehicleMgr; // 车辆管理private FeeCalculator _feeCalculator; …

为什么大型网站能“秒回”你的用户名?揭秘毫秒级响应背后的“守门人”艺术

我们都经历过那个瞬间:在一个新平台注册时,你满怀期待地输入一个心仪的昵称,比如“ByteMonk”,点击“下一步”…… 几乎在你点击的同一瞬间,页面就弹出了那个让人抓狂的红色提示:“用户名已被占用”。 请暂停一下…

文件同步备份:为什么说“同步盘”是比“普通网盘”更高效、更安全的选择?

还在为文件误删或忘记保存而烦恼吗?本文深度评测2024年主流文件同步软件,助你找到最佳数据备份方案。首选推荐坚果云,其无感自动同步与强大的“文件历史版本”功能,能有效防止数据丢失,是你的终极数据“后悔药”。…

连中五标,中电金信国际化服务助力企业出海

近日,中电金信语言服务业务持续发力,凭借专业的技术实力与定制化服务能力,成功中标涵盖数字支付与金融科技、AI制造、游戏研发与发行、社交电商、互联网高科技等五个重点项目。这一系列合作成果,不仅是市场对中电金…

1195. 交替打印字符串

1195. 交替打印字符串 题目描述编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:如果这个数字可以被 3 整除,输出 "fizz"。如果这个数字可以被 5 整除,输出 "buzz"。如果这个数字…

企业微信ipad协议实现聚合聊天系统、RPA机器人智能回复

企业微信ipad协议实现聚合聊天系统、RPA机器人智能回复一、企业微信iPad协议技术解析 企业微信iPad协议是一种基于企业微信iPad版本的智能接口服务,通过自主研发的中间件技术实现企业微信生态功能的深度集成 。 与依赖…

2025年市面上别墅石材品牌与行业内别墅石材源头厂家推荐榜单及口碑好的别墅石材产品分析

摘要 随着高端住宅市场持续升温,别墅石材行业在2025年迎来新一轮发展机遇。消费者对石材品质、设计美感及供应链可靠性要求显著提升,本文基于市场调研数据及行业洞察,梳理当前别墅石材领域具有竞争力的品牌与企业。…

最近公共祖先 (LCA)

\(update : 2025/10/28\) 最近公共祖先, 即 \(LCA\) (\(Least\; Common\; Ancestor\)), 顾名思义, 用于在一棵树中求两个点的最近公共祖先 方法有很多, 效率和码量各有千秋 倍增法 很经典的 \(lca\) 求法, 主要是好理解…

IP归属地颗粒度和IP应用场景的关系

在我们日常生活中,IP地址归属地定位(即识别IP对应地理位置)的精度(颗粒度)常因使用方式不同而各异。颗粒度指的是位置识别的细致程度,例如国家、省、城市、区县或街道层级。IP地址的应用场景(如家庭宽带或数据中…

ChatGPT API集成测试自动化框架的实践与成效汇报

一、项目背景与目标 随着软件测试复杂度的提升,传统测试流程面临效率瓶颈。2025年,我司测试团队探索将ChatGPT API集成至现有自动化框架,旨在通过自然语言处理能力优化测试用例生成、缺陷定位及报告分析等环节,实现…

[题解]【MX-S8】梦熊 CSP-S 2025 模拟赛

原比赛页面 ~ 官方题解(直播回放) T1. P14308 【MX-S8-T1】斐波那契螺旋 发现方形的边长是斐波那契数列,增长非常快。打表发现,只要 \(91\) 个方形就能覆盖 \([-10^{18},10^{18}]\) 内的所有点。 所以模拟即可。时…

2025四川碳晶板品牌

文章摘要 碳晶板作为现代建筑装饰材料的新兴趋势,近年来在环保、耐用性和安装便捷性方面展现出显著优势,行业年增长率预计达15%以上。本文基于市场调研和用户反馈,整理了2025年碳晶板品牌排名前十的榜单,旨在为读者…

详细介绍:求余运算和数学模运算的知识了解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于蚁群算法解决车辆路径问题(VRP)的MATLAB实现

一、算法框架设计 %% 参数设置 m = 31; % 蚂蚁数量(建议取城市数平方根) alpha = 1; % 信息素重要度 beta = 5; % 启发式信息重要度 rho = 0.1; % 信息素挥发系数 Q = 100; % 信息素…

2025 年工业除湿机,恒温恒湿机,精密空调,除湿加湿一体机厂家最新推荐,产能、专利、环保三维数据透视

引言 工业生产与商用场景中,温湿度精准控制直接影响设备寿命与产品品质,潮湿或温湿度失衡可能导致电子元件失效、医药原料变质等问题。随着市场需求升级,相关设备厂家数量激增,但产品性能差异显著,部分设备存在除…

从手动到全自动:我们如何用Dify重构了API回归测试流程

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 在敏捷开发成为主流的今天,API回归测试已成为保障软件质量的关键环节。然而,传统手动回归测试模式在快速迭代中显得力不从心。本文将完整…

2025 年管道除湿机,中央除湿机,新风除湿机,变频除湿机厂家最新推荐,产能、专利、环保三维数据透视

引言 管道、中央、新风及变频除湿机作为精准控湿的核心设备,已广泛应用于工业生产、商业办公及家庭生活等多元场景。但市场调研显示,同类产品除湿量实测值最大相差 41.7%,单位能耗效率差异近一倍,给采购者带来极大…

2025年10月中国管理咨询公司推荐榜:五强数据对比

正在升级产线、准备上市、或是被库存和交付周期反复折磨的制造业老板,最近常把同一句话挂在口头:“有没有真能把方案落到车间、落到报表上的咨询公司?”政策层面,工信部《“十四五”智能制造规划》把“管理提升”写…

条码识别插件 quaggaJS - microsoft

github下载地址 document.querySelector("#barCode").addEventListener(change, function (evt) {const file = evt.target.files[0];const fileURL = URL.createObjectURL(file);// 使用 Quagga 解码条形码…