CPP类的声明和定义

本文详细介绍了C++中的类声明与定义,包括构造函数、析构函数、类成员的访问修饰符、内联函数、const属性、静态成员、嵌套类、友元以及命名空间的使用,帮助读者掌握C++类的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更多信息 进群了解
QQ群:712333606

一、 类的声明和定义

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对象list
	list.OutputItem();						//调用CList的OutputItem方法
	return 0;
}

1.9 命名空间

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

namespace MyName
{
    int iInt1 = 10;
    int iInt2 = 20;
};

//使用命名空间的成员
MyName::iInt1 = 30;
1.9.1 嵌套命名空间

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

更多信息 进群了解
QQ群:712333606

### C++ 中声明定义 #### 声明 声明通常位于头文件(`.h` 或 `.hpp`)中,用于向编译器提供关于的信息而不涉及具体的实现细节。这使得其他源文件可以知道这个的存在并使用它。 ```cpp // MyClass.h #ifndef MYCLASS_H #define MYCLASS_H class MyClass { public: // 构造函数声明 MyClass(); // 成员函数声明 void setValue(int val); int getValue() const; private: // 数据成员声明 int value; }; #endif // MYCLASS_H ``` 上述代码展示了如何在一个头文件 `MyClass.h` 中声明一个名为 `MyClass` 的[^1]。 #### 定义 的具体实现在源文件(通常是 `.cpp` 文件)中完成。这里提供了之前在头文件中声明的所有成员函数的实际编码逻辑。 ```cpp // MyClass.cpp #include "MyClass.h" // 构造函数定义 MyClass::MyClass() : value(0) {} // 设置值的成员函数定义 void MyClass::setValue(int val) { this->value = val; } // 获取值的成员函数定义 int MyClass::getValue() const { return this->value; } ``` 这段代码说明了怎样通过源文件来定义 `MyClass` 中的各个部分。 当涉及到模板时,则推荐将整个及其成员函数放在同一个头文件内,因为模板实例化发生在编译期间而非链接阶段: ```cpp // MyTemplateClass.h #ifndef MYTEMPLATECLASS_H #define MYTEMPLATECLASS_H template <typename T> class MyTemplateClass { public: MyTemplateClass(T initVal); void set_value(const T& newVal); T get_value() const; private: T m_value; }; template <typename T> MyTemplateClass<T>::MyTemplateClass(T initVal) : m_value(initVal) {} template <typename T> void MyTemplateClass<T>::set_value(const T& newVal) { m_value = newVal; } template <typename T> T MyTemplateClass<T>::get_value() const { return m_value; } #endif // MYTEMPLATECLASS_H ``` 此段代码解释了对于泛型编程而言,在单个头文件里既声明定义模板的做法更为合适[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值