c/c++开发,无可避免的自定义类类型(篇一).常用基本函数实现案例

目录

一、C++类的常用基本函数

二、类基本成员函数实例设计

三、 类基本成员函数调用测试


一、C++类的常用基本函数

        C++类的常用基本函数主要包括:默认构造函数,普通构造函数,拷贝构造函数,析构函数,赋值(=,运算符重载)函数:

        1.默认构造函数,在没有显式初始值时,用来创建对象的构造函数,例如A(){...}

        2.普通构造函数,无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。通过编译器来调用。例如A(int x){...}

        3.拷贝构造函数,用于将一个对象复制到新创建的对象中。它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中,即当函数按值传递对象或者函数返回对象时,都将使用拷贝构造函数。例如A(A&){...}

        4.=赋值运算符重载,用于给类对象赋值,参数要使用引用,可以避免调用拷贝构造函数创建副本,返回值为对象引用,也可以避免使用拷贝构造函数。例如A& operator = (A&) {...},在进行重载时,要检测自我赋值这种情况,避免出错。

        5.析构函数,析构函数是与构造函数匹配的函数,用于对象注销。主要用于释放在构造函数中动态申请内存空间。

二、类基本成员函数实例设计

        例如,编写一个类似String 类的命名为MyString类为例,包含上述基本成员函数,采用一个字符指针成员变量存储数据。

        mystring.h

#ifndef _MYSTRING_H_
#define _MYSTRING_H_

#include<stddef.h>	//NULL引用

class MyString
{
public:
	MyString(void);							//默认构造函数
	MyString( const char *str = NULL );		//普通构造函数
	MyString( const MyString &other );		//拷贝构造函数
	~MyString( void );						//析构函数
	MyString& operator=(const MyString &other);	//赋值函数
	char* c_str(void) const;				//取值(取值)
private:
	char *m_data;
};

#endif

        mystring.cpp

#include "mystring.h"

#include <string.h>	//strlen strcpy
#include <assert.h>	//assert
//默认构造函数
MyString::MyString(void)
{
	MyString(NULL);	//内部调用普通构造函数
}
//普通构造函数
MyString::MyString(const char *str)
{
	if(str==NULL)
	{
		m_data = new char[1];	//对空字符串自动申请存放结束标志'\0'的空
		*m_data = '\0';
	}else{
		int length = strlen(str);
		m_data = new char[length+1]; // 分配内存
		assert(NULL!=m_data);		 // m_data的NULL判断
		strcpy(m_data, str);
	}
}
// MyString 的析构函数
MyString::~MyString(void)
{
	delete [] m_data; // 或 delete m_data;
}

//拷贝构造函数
MyString::MyString( const MyString &other ) //输入参数为const型
{
	int length = strlen(other.m_data);
	m_data = new char[length+1];	//对 m_data 加 NULL 判断
	assert(NULL!=m_data);
	strcpy(m_data, other.m_data);
}

//赋值函数
MyString &MyString::operator =( const MyString &other )//输入参数为const型
{
	if(this == &other)				//检查自赋值
		return *this;				
	delete [] m_data;				//释放原有的内存资源
	int length = strlen( other.m_data );
	m_data = new char[length+1];	//重新分配内存
    assert(NULL!=m_data);			//对 m_data 加 NULL 判断
	strcpy( m_data,other.m_data );
	return *this;					//返回本对象的引用
}

char* MyString::c_str(void) const
{
	return (char*)m_data;
}

      注意: 

        1、在构造函数中使用new,需要在析构函数中调用delete释放。new和delete,new [] 和delete [] 匹配使用。如果存在多个构造函数,使用new的方式要一致,因为析构函数只有一个。

        2.赋值运算符(=),注意防止自赋值,并确保深层次赋值,例如覆盖到各个变量,尤其是各变量中涉及到结构体、或类对象的情况。返回值一般都为对象。

三、 类基本成员函数调用测试

        main.cpp

#include "mystring.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
	MyString test("hello world!");	//普通构造函数调用
	printf("%s\n",test.c_str());	//
	MyString test1 = "test world!";	//默认构造函数及赋值函数调用
	printf("%s\n",test1.c_str());
	MyString *test2 = new MyString(test);//拷贝构造函数调用
	printf("%s\n",test2->c_str());
	delete test2;					//析构函数调用
	test2 = NULL;
	return 0;
}

       命令窗口运行:g++ main.cpp mystring.h -o test.exe及运行输出结果test.exe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

py_free-物联智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值