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类型 用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较. 例子: ...
随机推荐
- chrome命令
chrome://settings(设置) chrome://extensions(扩展程序) chrome://history(历史记录) chrome://settings/clearBrowse ...
- Pandas 之 过滤DateFrame中所有小于0的值并替换
Outline 前几天,数据清洗时有用到pandas去过滤大量数据中的“负值”: 把过滤出来的“负值”替换为“NaN”或者指定的值. 故做个小记录. 读取CSV文件 代码: import pandas ...
- window安装redis数据库
1.下载安装包 1.百度网盘链接:https://pan.baidu.com/s/1MrAK5Suc1xpzkbp1WQbP0A 提取码:u9uq 2.GitHub:https://github.co ...
- Linux上free命令的输出及其他
一.明确概念 A buffer is something that has yet to be "written" to disk. A cache is something t ...
- 0601-Zuul构建API Gateway-API gateway简介、基础使用、路由配置、负载配置
一.API Gateway简介 参看:http://www.cnblogs.com/bjlhx/p/8794437.html 二.zuul简介[路由器和过滤器:Zuul] 在微服务架构的组成部分进行路 ...
- 在用 JavaScript 工作时,我们经常和条件语句打交道,这里有5条让你写出更好/干净的条件语句的建议。
1.多重判断时使用 Array.includes 2.更少的嵌套,尽早 return 3.使用默认参数和解构 4.倾向于遍历对象而不是 Switch 语句 5.对 所有/部分 判断使用 Array.e ...
- appium入门基础
1. 建立session时常用命令: DesiredCapabilities cap = new DesiredCapabilities(); cap.SetCapability("brow ...
- 我们为什么使用ORM
我们为什么使用ORM? http://www.cnblogs.com/tansm/archive/2006/06/07/419927.html 博客园在推广ORM方面的确做了很大的贡献,很多的程序员开 ...
- mybatis参数处理 $#
- python之路 前段之html,css
一.HTML 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏 ...