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

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

一、 类的声明和定义

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.dtcms.com/a/541439.html

相关文章:

  • 企业网站建设方案资讯查询公司的网站
  • 高端企业网站建设公司免费网站代理访问
  • JavaEE初阶——多线程(4)线程安全
  • 杭州网站推广营销服务深圳做美颜相机的公司
  • 什么样 个人网站 备案适合做网站的软件有哪些
  • 做设计在哪个网站上找高清图青岛做物流网站
  • 数据源切换的陷阱:Spring Boot中@Transactional与@DS注解的冲突博弈与破局之道
  • Kubernetes节点资源优化:自托管代理配置实践
  • 1688网站怎样做推广东莞市路桥收费所
  • 做网站需要用到哪些开发软件潜江资讯网信息发布
  • Day2实战-元组的基本操作
  • 01 数学建模中M的取值影响及分析
  • 深入 Actix-web 源码:解密 Rust Web 框架的高性能内核
  • Linux远程控制Windows桌面的cpolar实战指南
  • 焦作网站建设哪家好自己怎么用h5做网站
  • 论坛程序做导航网站photoshop安卓版
  • FP16 vs INT8:Llama-2-7b 昇腾 NPU 精度性能基准报告
  • Steering Llama 2 via Contrastive Activation Addition
  • 座舱出行Agent实战(三):专能化架构如何实现效率与稳定性的双重飞跃
  • 淘宝联盟怎么新建网站网站设计教程
  • 一篇文章深入理解Elasticsearch高级用法
  • 【数据工程】14. Stream Data Processing
  • Elasticsearch入门指南:从零到精通
  • wordpress 非插件七牛cdn全站加速东至网站建设
  • 进出口网站贸易平台有哪些个人网站可以做推广吗
  • 游戏网站首页设计服务器有了网站怎么做
  • 计算机组成原理---存储系统
  • Vector深度剖析及模拟实现
  • Linux进程:进程属性
  • word文档做网站建立网站地图