C++空类和string类
1. 空类
1.1 空类默认哪六个成员函数。
class Empty
{
public:
Empty(); //缺省构造函数 Empty e;
Empty( const Empty& ); //拷贝构造函数 Empty e2(e1);
~Empty(); //析构函数
Empty& operator=( const Empty& ); //赋值运算符 Empty e2 = e1;
Empty* operator&(); //取址运算符 &e
const Empty* operator&() const; //取址运算符const &e
};
1.2 空类的sizeof()=1
每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。
2. string类
以下四个函数,是C++编译器会自动加入的四个函数。
class MyString
{
public:
MyString(const char *str = NULL);//默认参数,不传递的该参数的时候发挥作用。
MyString(const MyString &other);
MyString& operator=(const MyString &other);
~MyString();
private:
char *m_data;
};
MyString::~MyString()
{
delete [] m_data;
}
MyString::MyString(const char *str)
{
if(NULL == str)
{ cout<<"调用普通构造函数1"<<endl;
m_data = new char[];
*m_data = '\0';
}
else
{
cout<<"调用普通构造函数2"<<endl;
size_t length = strlen(str);
m_data = new char[length+];
strcpy(m_data,str);
}
}
MyString::MyString(const MyString &other)
{ cout<<"调用拷贝构造函数"<<endl;
size_t length = strlen(other.m_data);
m_data = new char[length+];
strcpy(m_data,other.m_data);
}
MyString& MyString::operator =(const MyString &other)
{
cout<<"调用赋值函数"<<endl;
//检查自赋值
if(this == &other)
return *this;
//释放原有的内存资源
delete [] m_data;
int length = strlen(other.m_data);
m_data = new char[length+];
strcpy(m_data,other.m_data);
return *this;
}
int _tmain(int argc, _TCHAR* argv[])
{
MyString s0;//"调用普通构造函数1"
MyString s1 = "hi";//"调用普通构造函数2"
MyString s2("hi");//"调用普通构造函数2" MyString s3 = s1;//"调用拷贝构造函数"上述实现为深拷贝。
MyString s4(s2);//"调用拷贝构造函数"
s4 = "hello!";//将"hello!"传入赋值函数形参时,要调用普通构造函数2;接着调用赋值函数。
s4 = s3;//"调用赋值函数"
return ;
}
总结:仅定义对象或者传递对象的时候调用构造函数。
说明:拷贝构造函数必须传引用。调用拷贝构造函数如果传值,编译器会新开辟一段栈内存,建立此对象的临时拷贝,而建立临时拷贝又需要值传递调用拷贝构造函数,如此
进入死循环,直至内存耗尽死机。而传引用则无需新开辟内存空间,无需调用构造函数,形参对象只是另一个对象的别名。
C++空类和string类的更多相关文章
- Java的常用类——Object类、String类
Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...
- Java Object类 和 String类 常见问答 6k字+总结
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- C#中 StringBuilder类 与 String类的区别---(转)
在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...
- Hadoop: Text类和String类的比较
一般认为Text类和String类是等价的,但二者之间其实存在着不小差别: 以<Hadoop权威指南>中的案例为例,给定字符串 String s = "\u0041\u00DF ...
- Java基础知识强化32:String类之String类的判断功能
1. String类的判断功能: boolean equals (Object obj ) boolean equalsIgnoreCase (String str ) boolean contain ...
- 07 Object类,Scanner,Arrays类,String类,StringBuffer类,包装类
Object类的概述:* A:Object类概述 * 类层次结构的根类 * 所有类都直接或者间接的继承自该类* B:构造方法 * public Object() * 子类的构造 ...
- StringBuffer类和String类(原文地址 : http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html)
StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...
- (1)Object类 (2)包装类和数学处理类 (3)String类
1.Object类1.1 基本概念 java.lang.Object类是Java类层次结构的根类,任何类都是Object类的直接/间接子类. 1.2 常用的方法(重点) Object() - 无参构造 ...
- Object类和String类
Object类 Object类是Java语言中的根类,即所有类的父类. equals方法 返回值类型为:boolean类型 用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较. 例子: ...
随机推荐
- Vijos p1303导弹拦截(LIS+贪心)
传送门:https://vijos.org/p/1303 背景 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题開始训练. 描写叙述 某国为了防御敌国的导弹突击,研发出一种导弹拦截系统. 可是这 ...
- ViewConfiguration 和 ViewConfigurationCompat
Contains methods to standard constants used in the UI for timeouts, sizes, and distances. 一.几个常用的方法 ...
- Java Concurrent happens-before
happens-before relation on memory operations such as reads and writes of shared variables. The resul ...
- 利用VMware克隆linux虚拟机需要注意的事项
利用VMware克隆虚拟机需要注意的问题 2018年03月30日 18:20:29 温文尔雅的流氓 阅读数:1343更多 个人分类: linux 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- [动态规划]UVA10285 - Longest Run on a Snowboard
Problem C Longest Run on a Snowboard Input: standard input Output: standard output Time Limit: 5 sec ...
- Python和数据科学的起步指南
http://python.jobbole.com/80853/ Python拥有着极其丰富且稳定的数据科学工具环境.遗憾的是,对不了解的人来说这个环境犹如丛林一般(cue snake joke).在 ...
- R中apply函数族
参考于:http://blog.fens.me/r-apply/ 1. apply的家族函数 2. apply函数 apply函数是最常用的代替for循环的函数.apply函数可以对矩阵.数据框.数组 ...
- Winio.dll的使用
Winio.dll的使用 WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作.通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系 ...
- Silverlight中获取控件中子控件
如题:,直接来看代码: /// <summary> /// 查找并返回第一个 相同 name的子元素 /// </summary> /// <typeparam name ...
- IDEA MAVEN Project 显示问题
今天正常打开idea,却发现maven窗口找不到了:试了这些方法 首先idea自带了maven控件,不像Eclipse还需要下载控件,如果你以前有maven在右边,出于某种原因,消失找不到 了,你可以 ...