一、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