C++拷贝构造&操作符重载
头文件 DString.h如下
#ifndef __DSTRING_H
#define __DSTRING_H
#endif #include <stddef.h> class DString
{
public:
DString(const char * c = NULL); // default constructor
DString(const DString &str); // copy constructor - implement DEEP copy ~DString(); /*
必须使用成员函数重载的运算符 = ( ) [ ] ->
必须使用友元函数重载的运算符 << >>
P.S. 一目运算符,建议使用成员函数;二目运算符,建议只用友元函数
*/
DString& operator = (const DString &str);
friend DString operator + (const DString &s1, const DString &s2);
char* dcopy(char * dst, const char * src); private:
char * m_data;
};
实现如下DString.cpp
#include <string.h> #include "DString.h" DString::DString(const char * c)
{
if(NULL == c)
{
m_data = new char('\0');
}
else
{
m_data=new char[strlen(c) + ];
dcopy(m_data, c);
}
} DString::DString(const DString &str)
{
if(NULL== str.m_data)
{
m_data=NULL;
}
else
{
m_data=new char[strlen(str.m_data) + ];
dcopy(m_data, str.m_data);
}
} DString::~DString()
{
delete [] m_data;
} DString& DString::operator = (const DString &str)
{
if(this == &str) // the same one
{
return *this;
}
else
{
delete [] m_data;
m_data=new char[strlen(str.m_data)+];
dcopy(m_data,str.m_data);
return *this;
}
} // no :: because friend function doesnt belong to the class
DString operator + (const DString &s1, const DString &s2)
{
if(NULL == s1.m_data)
{
return DString(s2);
} if(NULL == s2.m_data)
{
return DString(s1);
} char * temp = new char[strlen(s1.m_data) + strlen(s2.m_data) + ];
strcpy(temp, s1.m_data);
strcpy(temp+strlen(s1.m_data), s2.m_data); return DString(temp);
} char* DString::dcopy(char * dst, const char * src)
{
char * tmp = dst; while(*src != '\0')
{
*tmp++ = *src++;
} *tmp = ; return dst;
}
DString.cpp
调用入口main.cpp
#include "DString.h" int main(int argc, char* argv[])
{
DString s1("abcde"); //call default cons
DString s2 = "ABC"; //call default cons DString s3 = s2; //call copy cons
DString s4(s3); //call copy cons s1 = s4; //call operator = s4 = s1 + s2 + "ding"; //call default cons then + then + then =
return ;
}
一些知识点(以在代码中出现的顺序排列)
- 对于一个空的类,默认会有6个成员函数:构造/析构/拷贝构造/赋值/const取址/非const取址
- 在函数声明时使用了默认参数,则在实现时就不能再次指定默认参数
- 对于基本类型(没有析构函数)释放内存时delete同delete[] (原则是与NEW NEW[]配对使用)
- 显示声明拷贝构造函数以实现深拷贝(否则自动生成浅拷贝版本),调用场景为:根据已有对象初始化新对象
- 显示声明赋值函数,若已实现深拷贝
- 重载二元操作符时,应使用友元函数(若使用成员函数实现则只需传递一个参数,另一个参数是自己)
- 友元函数/类,是通往私有成员的后门。其设计宗旨是,一种外部函数/类也可以访问类的私有成员。
- 友元函数不属于类,因此实现时,不需要也不能加::
- 友元函数不能使用this指针,因此使用时通常需要把类的对象作为参数传入
- 友元函数的典型使用场景是:一个函数需要访问多个类
- 重载+返回的是临时对象,因此不能函数返回值类型不能是引用
C++拷贝构造&操作符重载的更多相关文章
- 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)
十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...
- C++中的赋值操作符重载和拷贝构造函数
1,关于赋值的疑问: 1,什么时候需要重载赋值操作符? 2,编译器是否提供默认的赋值操作符? 2,关于赋值的疑问: 1,编译器为每个类默认重载了赋值操作符: 1,意味着同类型的类对象可以相互赋值: 2 ...
- C++ 进阶5 拷贝构造 深度复制 运算符重载
C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * * Created on: 2013年10月26日 * ...
- c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...
- C++之旅:拷贝构造与友元
拷贝构造与友元 拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象:友元可以让一个类的所有属性(主要是private)对特定的类开放 拷贝构造 如果没有复写拷贝构造函数,系统会帮我们默认生成 ...
- [c++基础]3/5原则--拷贝构造函数+拷贝赋值操作符
/* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> #include &qu ...
- C++ 操作符重载 (operator)
重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...
- C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载
1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...
- C++等号操作符重载
在新学操作符重载时最令人头疼的可能就是一些堆溢出的问题了,不过呢,只要一步步的写好new 与 delete.绝对不会有类似的问题. 当时我们编译可以通过,但是运行会出错,因为对象s1与s2进行赋值时, ...
随机推荐
- 把windows的bat用好了,也很不错
taskkill /f /t /im nginx.exe cp2nginx xcopy /e /i /y “D:\workspace\workspace1\aff\WebContent” “D:\ng ...
- 在php中使用jquery uploadify进行多图片上传
jquery uploadify是一款Ajax风格的批量图片上传插件,在PHP中使用jquery uploadify很方便,请按照本文介绍的方法和步骤,为你的PHP程序增加jquery uploadi ...
- dev中TreeList的应用(转)
如果需要在单元格添加时则用TreeList如果只是单纯读取数据或检索数据时则用GridControl 1.如果点击添加 时则添加TreeList的节点: protected internal void ...
- docker mac 安装并初始化GO环境
mac 环境下,安装docker 下载链接:https://download.docker.com/mac/stable/Docker.dmg 下载完毕后,直接双击安装,下一步直到最后 创建docke ...
- 2.7. 属性的各种设置选项(Core Data 应用程序实践指南)
可供配置的选项根据属性类型的不同有所变化,并不是每一种属性都能配置下列选项 Transient:勾选该选项,表示该属性不写入“持久化存储区”,这听起来很奇怪,但有时候,只需要把特性留在托管对象上下文就 ...
- OC类方法的调用
有个Person类,有个Phone类,Person类想使用Phone类中打电话和发短信的方法 1.Phone.h Phone有kind和color属性 ,方法定义的时候将用到的参数都 ...
- react中常用的一些方法
React.createClass:创建一个ReactClass(组件类),参数是一个对象且必须带有 render 属性方法,该方法必须返回一个封闭的容器(容器内可以有其它不限结构的容器)或 null ...
- 关于P,NP,NPC和NP-hard的通俗解释
这些概念以前老是犯糊涂,今天整清楚.摘要:P: Polynomial SolvableNP: Non-determinstic Polynomial Solvable 0)词语解释:Polynomia ...
- MyBatis与Spring集成
beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...
- 二维动态规划——Palindrome
Palindrome Description A palindrome is a symmetrical string, that is, a string read identically from ...