编写类String的构造函数、拷贝构造函数、析构函数和赋值函数
一、题目:
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~String(void); // 析构函数
String & operator = (const String &other); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
各个解析:
1、构造函数
/*
1、构造函数在构造对象时使用;
2、传入参数的判断;
3、对象的初始化问题。
*/
String::String(const char *str)
{
if ( NULL == str)
{
m_data = new char[]
*m_data = '\0';
}
else
{
int len = strlen(str);
m_data = new char[len + ];
strcpy(m_data,str);
}
}
2、拷贝构造函数
/*
1、拷贝构造函数必须在构造对象时使用,即定义对象时;
2、对象初始化问题。
*/
String::String(const String &other)
{
int len = strlen(other.m_data);
m_data = new char[len+];
strcpy(m_data,other.m_data);
}
3、赋值函数
/*
1、赋值函数使用时,对象肯定已经建立;
2、赋值前,判断是否是自我赋值;
3、赋值前,内存空间的准备:
由于赋值前,对象已占有一定大小内存,但是赋值对象所占内存大小与
对象已占的内存大小不一定一致;
先释放对象已占的内存,然后分配心内存。
4、正常赋值
*/
String & String::operator = (const String &other)
{
if (&other == this)
{
return *this;
} delete [] m_data;
int len = strlen(other.m_data);
m_data = new char[len+];
strcpy(m_data,other.m_data); return *this;
}
4、析构函数
/*
资源的释放
*/
String::~String(void)
{
delete []m_data;
}
5、拷贝构造函数与赋值函数相关知识
1、 拷贝构造函数与赋值函数的区别?
在看到“=”操作符为对象赋值的时候,
如果是在对象定义时(Test B = (Test)c),此时调用拷贝构造函数;
如果不是在对象定义赋值时(B = c),此时调用赋值函数。
注:构造函数、拷贝构造函数,带有构造两个字,顾名思义,就是在对象声明或定义时才会使用。
2、拷贝构造函数与赋值函数定义的区别?
内存空间角度:
1)拷贝构造函数的使用,是在建立对象时;当时对象没有占有内存,故不需要释放内存,不重新建立内存空间。
2)赋值函数的使用,是在对象建立后;当时对象已经占有内存,故需要释放先前内存,然后重新获取内存空间。
编写类String的构造函数、拷贝构造函数、析构函数和赋值函数的更多相关文章
- 编写类String 的构造函数、析构函数和赋值函数
编写类String 的构造函数.析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str = NULL); // 普通构造 ...
- C/C++面试题:编写类String的构造函数、析构函数和赋值函数。
转https://www.cnblogs.com/alinh/p/9636500.html 考点:构造函数.析构函数和赋值函数的编写方法出现频率:☆☆☆☆☆已知类String的原型为: ...
- C++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数
构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数 ...
- String的构造函数、析构函数和赋值函数
编写类String的构造函数.析构函数和赋值函数 已知类String的原型为: class String { public: String(const char *str = NULL); // 普通 ...
- 编写类String的构造函数、析构函数和赋值函数
已知类String的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const Str ...
- 使用new分配内存的类需要自己定义拷贝构造函数
13.22 假定我们希望HasPtr的行为像一个值.即,对于对象所指向的string成员,每个对象都有一份自己的拷贝. #include<iostream> #include<str ...
- C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...
- c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数
每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A ...
- CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数
类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 // person.h #ifndef _PERSON_H_ #define _PERSON_H_ class Person{ public : ...
随机推荐
- [转载]tcp可靠性的好文
TCP是通过什么方式来提供可靠传输的 2012-11-23 14:18 665人阅读 评论(0) 收藏 举报 TCP是通过什么方式来提供可靠传输的 (合理截断数据包,超时重发,校验,失序重新排序,能够 ...
- JavaScript高级程序设计46.pdf
鼠标按钮 只有在主鼠标按钮被单击(或键盘回车键被按下)是才会触发click事件,对于mousedown和mouseup事件,其event对象存在一个button属性,表示按下或者释放按钮.DOM的bu ...
- Python的高级特性之切片、迭代、列表生成式、生成器
切片 切片就是获取一个list.tuple.字符串等的部分元素 l = range(100) #取[0,5)元素 print(l[:5]) #[0, 1, 2, 3, 4] #在[0,99]中每隔10 ...
- Shell函数:Shell函数返回值、删除函数、在终端调用函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...
- iOS UILabel:宽度固定,自动高度显示全部文字
desclabel.width = self.view.width - (leftOffset*2); desclabel.lineBreakMode = NSLineBreakByWordWrapp ...
- 用Android++在Visual Studio中用C/C++开发Android应用
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Android++在Visual Studio中用C/C++开发Android应用.
- 百度的android采访分析
今天早上10分,我接到一个电话采访百度.当然,我说提前.我的病是多么强烈延迟.所以我也没怎么准备,当然,我也看他们的真实水平的思考.在这次审查中! ! ! ! ! !! .! ! ! !.!! !.! ...
- 经验总结17--submitbutton,ajax提交
发篇小文章,纪念七七事变. submit一般用于提交表单,可是想使用ajax进行提交,又想按"enter"触发button. 那么就阻止提交表单的事件,进行自己定义的提交. 1.让 ...
- android 60 发送短信
import android.os.Bundle; import android.app.Activity; import android.telephony.SmsManager; import a ...
- Android 动画及属性动画
Android 平台提供了一套完整的动画框架,在Android3.0之前有两种动画Tween Animation(补间动画)和Frame Animation(帧动画), 对应SDK中的View Ani ...