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类的更多相关文章

  1. Java的常用类——Object类、String类

    Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...

  2. Java Object类 和 String类 常见问答 6k字+总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  3. C#中 StringBuilder类 与 String类的区别---(转)

      在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...

  4. Hadoop: Text类和String类的比较

    一般认为Text类和String类是等价的,但二者之间其实存在着不小差别: 以<Hadoop权威指南>中的案例为例,给定字符串  String s = "\u0041\u00DF ...

  5. Java基础知识强化32:String类之String类的判断功能

    1. String类的判断功能: boolean equals (Object obj ) boolean equalsIgnoreCase (String str ) boolean contain ...

  6. 07 Object类,Scanner,Arrays类,String类,StringBuffer类,包装类

    Object类的概述:* A:Object类概述    * 类层次结构的根类    * 所有类都直接或者间接的继承自该类* B:构造方法    * public Object()    * 子类的构造 ...

  7. StringBuffer类和String类(原文地址 : http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html)

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  8. (1)Object类 (2)包装类和数学处理类 (3)String类

    1.Object类1.1 基本概念 java.lang.Object类是Java类层次结构的根类,任何类都是Object类的直接/间接子类. 1.2 常用的方法(重点) Object() - 无参构造 ...

  9. Object类和String类

    Object类 Object类是Java语言中的根类,即所有类的父类. equals方法 返回值类型为:boolean类型 用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较. 例子: ...

随机推荐

  1. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

  2. android studio上传项目到github报错Successfully created project 'Demo' on GitHub, but initial commit failed:

    今天博主正在愉快地学习在AndroidStudio中使用Git,结果报了下面这个错∑(っ°Д°;)っ: Can't finish GitHub sharing process Successfully ...

  3. go——函数

    1.定义 函数是结构化编程的最小单元模式.它将复杂的算法过程分解为若干个较小任务,隐藏相关细节,使程序结构更加清晰,易于维护.函数被设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果 ...

  4. go——基本类型

    Go有许多预定义类型,这里简单把它们分为基本类型和高级类型.下面是基本类型列表: Go的基本类型共有18个,其中int和uint的实际宽度会根据计算架构的不同而不同.在386计算架构下,它的宽度为32 ...

  5. JavaScript:关闭当前页面(微信、电脑)

    WeixinJSBridge.call('closeWindow'); // 关闭微信浏览器 window.opener=null; window.open('','_self'); window.c ...

  6. 自定义mousewheel事件,实现图片放大缩小功能实现

    本文是承接 上一篇的<自定义鼠标滚动事件>  的基础上实现的,建议大家先看一下上一篇的mousewheel的实现,再浏览下文: 上篇中我们介绍到: $element.mousewheel( ...

  7. Linux命令(6/28)——declare/typeset命令

    declare 与 typeset 命令是bash的内建命令,两者是完全一样的,用来声明shell变量,设置变量的属性. declare命令(别名typeset)属shell内建命令,用于申明shel ...

  8. Linux下代理服务器(proxy)配置

    Linux下有很多程序都只有命令行接口,对于这类程序,它们通过代理服务器(proxy)访问网络的方式也不尽相同.在本文中Easwy总结了一些常用Linux程序配置代理服务器的方法. [ 通用代理服务器 ...

  9. [pixhawk笔记]4-如何写一个简单的应用程序

    本文主要内容来自于:https://dev.px4.io/en/tutorials/tutorial_hello_sky.html,并对文档中的部分问题进行更正. 本文假设已经建立好开发环境并能正确编 ...

  10. 20145229吴姗珊《网络对抗》MSF基础应用

    20145229吴姗珊<网络对抗>MSF基础应用 试验过程及基础知识 实验完成问题回答 用自己的话解释什么是exploit,payload,encode. exploit:通过一个漏洞对程 ...