C++空类和string类

1. 空类

1.1 空类默认哪六个成员函数。

 1 class Empty
 2 {
 3   public:
 4       Empty(); //缺省构造函数 Empty e;
 5       Empty( const Empty& ); //拷贝构造函数 Empty e2(e1);
 6       ~Empty(); //析构函数
 7       Empty& operator=( const Empty& ); //赋值运算符 Empty e2 = e1;
 8       Empty* operator&(); //取址运算符 &e
 9       const Empty* operator&() const; //取址运算符const &e
10 };

 

1.2 空类的sizeof()=1

每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。

2. string类

以下四个函数,是C++编译器会自动加入的四个函数。

 1 class MyString
 2 {
 3 public:
 4     MyString(const char *str = NULL);//默认参数,不传递的该参数的时候发挥作用。
 5     MyString(const MyString &other);
 6     MyString& operator=(const MyString &other);
 7     ~MyString();
 8 private:
 9     char *m_data;
10 };
11 MyString::~MyString()
12 {
13     delete [] m_data;
14 }
15 MyString::MyString(const char *str)
16 {
17     if(NULL == str)
18     {    cout<<"调用普通构造函数1"<<endl;
19         m_data = new char[1];
20         *m_data = '\0';
21     }
22     else
23     {
24         cout<<"调用普通构造函数2"<<endl;
25         size_t length = strlen(str);
26         m_data = new char[length+1];
27         strcpy(m_data,str);
28     }
29 }
30 MyString::MyString(const MyString &other)
31 {    cout<<"调用拷贝构造函数"<<endl;
32     size_t length = strlen(other.m_data);
33     m_data = new char[length+1];
34     strcpy(m_data,other.m_data);
35 }
36 MyString& MyString::operator =(const MyString &other)
37 {
38     cout<<"调用赋值函数"<<endl;
39     //检查自赋值
40     if(this == &other)
41         return *this;
42     //释放原有的内存资源
43     delete [] m_data;
44     int length = strlen(other.m_data);
45     m_data = new char[length+1];
46     strcpy(m_data,other.m_data);
47     return *this;
48 }
49 int _tmain(int argc, _TCHAR* argv[])
50 {
51     MyString s0;//"调用普通构造函数1"
52     MyString s1 = "hi";//"调用普通构造函数2"
53     MyString s2("hi");//"调用普通构造函数2"
54 
55     MyString s3 = s1;//"调用拷贝构造函数"上述实现为深拷贝。
56     MyString s4(s2);//"调用拷贝构造函数"
57     s4 = "hello!";//将"hello!"传入赋值函数形参时,要调用普通构造函数2;接着调用赋值函数。
58     s4 = s3;//"调用赋值函数"
59     return 0;
60 }

总结:仅定义对象或者传递对象的时候调用构造函数。

说明:拷贝构造函数必须传引用。调用拷贝构造函数如果传值,编译器会新开辟一段栈内存,建立此对象的临时拷贝,而建立临时拷贝又需要值传递调用拷贝构造函数,如此

进入死循环,直至内存耗尽死机。而传引用则无需新开辟内存空间,无需调用构造函数,形参对象只是另一个对象的别名。

 

转载于:https://www.cnblogs.com/shijianchuzhenzhi/p/4419255.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

客服会话 小程序 如何发起_小程序、公众号、App三者如何融合布局?这里有一份避坑指南...

对产品经理来说&#xff0c;小程序无疑是2020年最火爆的词之一了。我们能看到&#xff0c;就在今年疫情期间&#xff0c;小程序DAU达到4.5亿&#xff0c;而超市、生鲜果蔬、社区购物等都同比增长100个点左右&#xff0c;小程序的商业价值很明显地在快速释放。小程序如此火爆&am…

DOxygen for C++使用说明——注释代码二

这一次我在谷歌搜索中检索到了Doxygen在github的仓库&#xff0c;进去一看&#xff0c;令人大喜&#xff0c;github仓库里含有了一个Doxygen的官方配置文件Doxyfile,于是下载下来&#xff0c;发现Doxyfile已经配置了将仓库中的\src文件编译成Documentation,并且将结果放在了dox…

python super()(转载)

一、问题的发现与提出 在Python类的方法&#xff08;method&#xff09;中&#xff0c;要调用父类的某个方法&#xff0c;在Python 2.2以前&#xff0c;通常的写法如代码段1&#xff1a; 代码段1&#xff1a; class A:def __init__(self):print "enter A"print "…

Swagger+Spring mvc生成Restful接口文档

2019独角兽企业重金招聘Python工程师标准>>> Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法&#xff0c;参数和模型紧密集成到服务器端…

JavaScript——变量与基本数据类型

前言 JavaScript中的变量为松散类型&#xff0c;所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值&#xff0c;就是不像SQL一样申明某个键值为int就只能保存整型数值&#xff0c;申明varchar只能保存字符串。一个变量所保存值的类型也可以改变&#xff0c;这在Ja…

vscode可以打开jupyternotebook吗_刚刚,官方宣布 VS Code 支持 Python 全开发了!

关注Python高校每天早上23:10准时推送北京时间 2019 年 9 月 21 日&#xff0c;PyCon China 2019 在上海举行。在下午的演讲中&#xff0c;来自微软开发工具事业部的资深研发工程师韩骏做了主题为《Python 与 Visual Studio Code 在人工智能应用中的最佳 Azure 实践》的演讲。在…

C++类的内联成员函数应放在哪

今天复习C Primer的时候&#xff0c;看到了关于C类的内联成员函数的放置&#xff0c;应该放在头文件中。那么这到底是为什么 呢&#xff1f;仅仅是一种代码规范问题还是必须这样做呢&#xff1f; 下面我就来讲讲我自己的理解吧。要彻底理解这个问题&#xff0c;首先就要了解下函…

python selenium自动化(三)Chrome Webdriver的兼容

当一个自动化测试被实现在一个浏览器之后&#xff0c;我们会希望我们的测试能够覆盖到尽量多的别的浏览器。通过跨平台的测试来保证我们的程序在多个浏览器下都能正常工作。 在安装了selenium之后&#xff0c;firefox webdriver和IE webdriver就已经是ready to use的了&#xf…

NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

一直都是编译armabi的。没有不论什么问题&#xff0c;这个架构是软件模拟浮点运算的。后来看到NDK文档上说armabi-v7a是针对有硬件处理浮点计算的arm cpu的。 于是就改动配置编译armebai-v7a的so文件。 结果是编译没问题。一执行就是crash掉&#xff0c;Fatal signal 7 (SIGSEG…

作业三

作业三 第一章问题&#xff1a;书上写的“Bug的多少可以直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性”&#xff0c;那么一个比较完好的软件中一般大概会出现多少Bug? 第二章问题&#xff1a;现在开始训练写更多的程序能否更早地达到软件工程师的标准&#xff1…

springboot默认数据源如何设置连接数_Spring Boot系列之配置数据库连接池

在实际的应用开发中&#xff0c;与数据库交互通常使用数据库连接池来重用Connection对象&#xff0c;减少资源消耗。Spring Boot 的数据源是自动配置的。在 Spring Boot 2.2.1 版本中&#xff0c;有几种数据源配置可选&#xff0c;它们按照 HikariCP -> Tomcat -> DBCP2 …

使用Qt正则表达式提取全路径的文件名

问题描述&#xff1a; 给定三个全路径&#xff0c;例如 path1"C:/Users/asus/Desktop/nefertiti_4465.obj"; path2"C:/Users/asus/Desktop/nefertiti_4465_k1.txt"; path3"C:/Users/asus/Desktop/nefertiti_4465_k2.txt"; 我希望说明path2和pa…

Beyond Compare 3.3.8 build 16340 + Key

本文摘录自冰点社区&#xff1a;http://forum.z27315.com/topic/14746-beyond-compare-338-build-16340-key/ Download Beyond Compare 3 Current Version: 3.3.8, build 16340, released June 19, 2013 Windows 版本 Windows Standard and Pro EditionsEnglish version 5800k…

hdu 1198 Farm Irrigation

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid1198 题目大意&#xff1a; 有一大块土地需要浇水&#xff0c;这块土地由很多的小块土地&#xff08;有十一种&#xff09;组成&#xff0c;小块土地上有水沟&#xff0c;问至少需要建几个井&#xff0c;才能灌…

strcpy_s、sptintf_s与strcat_s的使用

strcpy_s、sptintf_s与strcat_s是strcpy、sptintf与strcat的安全版本&#xff0c;均是通过指定缓冲区长度来避免存在的溢出风险。 strcpy_s 与strcpy strcpy_s和strcpy函数的功能几乎是一样的。strcpy函数&#xff0c;就象gets函数一样&#xff0c;它没有方法来保证有效的缓冲…

小米一键上锁工具_小米首款高端全自动智能锁火热预售中,一触开启全自动时代...

近些年&#xff0c;随着科技的发展&#xff0c;人工智能逐渐走入大众视野。人类社会也正从信息时代向“智能时代”过渡&#xff0c;在整个过程中智能家居领域的蓬勃发展可谓当仁不让&#xff0c;一直备受用户瞩目。智能锁作为家的第一道守护防线&#xff0c;家庭物联网入口的关…

Eigen+suitesparse for windows 安装

Eigen是著名的C矩阵运算库&#xff0c;提供了许多矩阵运算的接口&#xff0c;主要包括两大部分&#xff0c;一部分是稠密矩阵&#xff0c;另一部分是稀疏矩阵。Eigen以源码形式提供给大家&#xff0c;用的时候&#xff0c;只要将源码包含在项目的包含路径上&#xff0c;具体安装…

软件盘控制的问题

2019独角兽企业重金招聘Python工程师标准>>> 在全屏模式或者是沉寝室标题栏 方案一&#xff1a;全屏模式 1.软键盘被EditText遮挡住了&#xff0c;如果说EditText被嵌套在有滑动的视图中,采取的方式是: activity中设置此属性 android:windowSoftInputMode"…

python语言学习零基础教学视频_Python告白小白视频教程(零基础入门)

1 Python编程基础入门篇通过本次课程的学习&#xff0c;我们每个人都可以进入python世界里&#xff0c;从简单到高级&#xff0c;让人人都能学会python&#xff0c;我们在学习的时候&#xff0c;python让我们的运维变得更有乐趣&#xff0c;让我们的运维更加的高大上&#xff0…

SQL 快速入门2.1

MySQL top&#xff08;MySQL limit&#xff09;语法 SELECT column_name(s) FROM table_name LIMIT number 例子 SELECT * FROM Persons LIMIT 5 SQL LIKE 操作符 SQL LIKE 操作符语法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern 原始的表 (用在例…