返回对象与应用区别:

拷贝构造器发生的时机:

1.构造新对象 A a, A b = a;
2.传参或返回对象

对于普通变量来说,传引用效果不是很明显,对于类对象而言,传对象效果很高。
传引用等价于扩大了原对象的作用域。

#include<iostream>
using namespace std;
class A
{
public:A()//无参构造器{cout<<this<<" constructor"<<endl;}~A()//析构器{cout<<this<<" destructor"<<endl;}A(const A & another)//拷贝构造器{cout<<this<<" cpy constructor from"<<&another<<endl;}A & operator=(const A & another)//运算符重载{cout<<this<<" operator"<<&another<<endl;}
};void func(A a)
{}
void func1(A &a)
{}int main()
{A x;//调用构造器A y = x;//拷贝构造器func(x);//调用拷贝构造器
/*
0x61fe9e constructor
0x61fe9d cpy constructor from0x61fe9e
0x61fe9f cpy constructor from0x61fe9e
0x61fe9f destructor
0x61fe9d destructor
0x61fe9e destructor
有构造器就有析构器
*/  func1(x);//没有调用任何构造器
/*
0x61fe9e constructor
0x61fe9d cpy constructor from0x61fe9e
0x61fe9f cpy constructor from0x61fe9e
0x61fe9f destructor
0x61fe9d destructor
0x61fe9e destructor
*/return 0;
}

栈上的对象是可以返回的,但不能返回栈上的引用(除非返回对象本身)。

#include<iostream>
using namespace std;
class A
{
public:A()//无参构造器{cout<<this<<" constructor"<<endl;}~A()//析构器{cout<<this<<" destructor"<<endl;}A(const A & another)//拷贝构造器{cout<<this<<" cpy constructor from"<<&another<<endl;}A & operator=(const A & another){cout<<this<<" operator"<<&another<<endl;}
};A func(A &a)
{return a;
}int main()
{A x;//调用构造器func(x);//发生了一次拷贝构造,但上述没有返回值的时候是没有任何构造器
/*
0x61feae constructor
0x61feaf cpy constructor from0x61feae
0x61feaf destructor
0x61feae destructor
*/return 0;
}
int main()
{A x;//调用构造器A t;//调用构造器t = func1(x);//x作为参数传入并没有调用构造器,而是返回大时候调用了拷贝构造器,(func1函数返回的值拷贝到临时变量中,再从临时变量拷贝到t,用来运算符重载)cout<<"&t "<<&t<<endl;
/*
0x61fe9e constructor
0x61fe9d constructor
0x61fe9f cpy constructor from0x61fe9e
0x61fe9d operator0x61fe9f
0x61fe9f destructor
&t 0x61fe9d
0x61fe9d destructor
0x61fe9e destructor
*/return 0;
}
A func()
{A b;return b;
}
int main()
{A t;t = func();cout<<"&t "<<&t<<endl;/*
0x61fe9e constructor
0x61fe9f constructor
0x61fe9e operator0x61fe9f
0x61fe9f destructor
&t 0x61fe9e
0x61fe9e destructor
*/return 0;
}
A& func()
{A b;return this;//是可以的,因为本身对象还没有销毁,如果返回的是b,返回后func销毁,有时候会正确,有时候会错误。
}

string类字符拼接的实现

mystring mystring::operator+(const mystring & another)
{mystring tmp;//delete []tem._str;int len = strlen(this->_str);len += strlen(another._str);tmp._str = new char[len+1];memset(tem._str,0,len+1);//必须要的strcat(tem._str,this->_str);strcat(tem._str,another._str);return tmp;
}

c与c++关于字符串的处理对比
c基于字符数组,利用一些方法strcpy,strlen,strcat等操作。
c++所有操作围绕字符指针。通过此指针进行操作,整体设计思想是面向对象思想。

面向对象的思想练习

#include<iostream>
#include<unistd.h>
#include<iomanip>
#include<time.h>using namespace std;
class Clock
{
private:int hour;int min;int sec;
public:Clock(){time_t t = time(NULL);struct tm ti = *localtime(&t);hour = ti.tm_hour;min = ti.tm_min;sec = ti.tm_sec;}void run(){while(1){show();//显示函数tick();//数据跟新函数}}
private:void show(){system("cls");//windows下的清屏clscout<<setw(2)<<setfill('0')<<hour<<":";cout<<setw(2)<<setfill('0')<<min<<":";cout<<setw(2)<<setfill('0')<<sec;}void tick(){sleep(1);if(++sec == 60){sec = 0;min += 1;if(++min == 60){min = 0;hour += 1;if(++hour == 24){hour = 0;}}}}
}int main()
{Clock c;c.run();return 0;
}

类成员的存储

#include<iostream>
using namespace std;
class Time
{
private:int hour;int min;int sec;
public:Time(int h,int m,int s):hour(h),min(m),sec(s){}void display(){cout<<hour<<min<<sec<<endl;//<=>//cout<<this->hour<<this->min<<this->sec<<endl;}
/*void display(Time *t){cout<<t->hour<<t->min<<t->sec<<endl;//自己通过显式传参。}
*/};
int main()
{Time t(1,2,3),t1(2,3,4),t2(4,5,6);cout<<sizeof(Time)<<"----"<<sizeof(t)<<endl;t.display();t1.display();t2.display();return 0;
}

上述代码display()函数,三个对象公用。对象在调用的时候传递了自己对象this。
对象拥有自己的存储空间,函数部分代码是公用的。表现的形式是每个对象在调用的时候传进自己的对象this。

注意事项

1,不论成员函数在类内定义还是在类外定义,成员函数的代码段都用同一种方式存储。
2,不要将成员函数的这种存储方式和 inline(内置)函数的概念混淆。inline 的逻辑意义是将函数内嵌到调用代码处,减少压栈与出栈的开支。
3,应当说明,常说的“某某对象的成员函数”,是从逻辑的角度而言的,而成员函数的存储方式,是从物理的角度而言的,二者是不矛盾的。类似于二维数组是逻辑概念,而物理存储是线性概念一样。

转载于:https://www.cnblogs.com/intelwisd/p/8547021.html

C/C++(C++返回对象与应用区别,类成员的存储)相关推荐

  1. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  2. C++ VS C# 结构体和对象的细微区别

    C++ VS C# 结构体和对象的细微区别 类与结构体在C++与C#中都是可以使用的,但是两者在两种语言中的区别却很大,今天在这里进行一下记录. 在C++中,类与结构体的唯一区别就是默认访问权限的区别 ...

  3. python中类方法与实例方法的区别-Python中的对象,方法,类,实例,函数用法分析...

    本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. class Foo ...

  4. JS对象与Dom对象与jQuery对象之间的区别

    前言 通过问题看本质: 举例: js的写法:document.getElementById('save').disabled=true; 在jquery中我是这样写的 $("#save&qu ...

  5. ASP.NET Application,Session,Cookie和ViewState等对象用法和区别

    ASP.NET Application,Session,Cookie和ViewState等对象用法和区别 在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,C ...

  6. 详细了解JS Map,它和传统对象有什么区别?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://www.codeproject.com/Articles/5278387/Unde ...

  7. 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)

    1:成员变量和局部变量的区别(理解) (1)在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 ...

  8. Python3网络爬虫教程2——urlopen的返回对象

    Python 全栈工程师核心面试 300 问深入解析(2020 版)----全文预览 Python 全栈工程师核心面试 300 问深入解析(2020 版)----欢迎订阅 上接:Python3网络爬虫 ...

  9. 【最精简写法】获取一维数组和对象数组最值:最大值、最小值,返回对象

    Math.max(...arr);//返回数组最大值 Math.min(...arr);//返回数组最小值Math.max(...objArr.map(o => o.最值字段名));//返回对象 ...

最新文章

  1. 微博并发这么牛逼!看他架构如何设计的?
  2. 恢复SAP IDES中SPFLI SFLIGHT SBOOK表数据
  3. 博弈论(Game Theory) - 04 - 纳什均衡
  4. (旧)走遍美国——(三、文化4)
  5. LeetCode 352. 将数据流变为多个不相交区间(map二分查找)
  6. 测试笔的使用_宽带故障怎么办?毕亚兹红光笔1秒定位光纤故障,快速解决问题...
  7. 2017.8.22区间最大值问题
  8. 【魔改蜗牛星际】A单主板变“皇帝板”扩展到8个SATA口
  9. Gosn解决在集合中int自动转换为duble类型
  10. API接口安全性设计
  11. linux:使用yum安装_首次使用Linux:30个安装案例
  12. Hbase Region的切分与合并【原理分析】
  13. Unity的AB包超详细+代码注释,小白一看就懂!
  14. 公司福利直接影响员工的身心健康
  15. 异或和校验(BCC)
  16. ListView滚动的方法
  17. Vue中的v-slot如何使用
  18. Wireshark lua 插件简介
  19. 【建议收藏】手把手带你搭建SSM项目
  20. 暴肝!7000 字的前端性能优化总结 | 干货建议收藏

热门文章

  1. 前段时间是Flash大战HTML5,现在是SliverLight“被遗弃”,我啊羡慕你们的热闹。...
  2. 【恋上数据结构】图代码实现、BFS、DFS、拓扑排序
  3. 《恋上数据结构第1季》平衡二叉搜索树、AVL树
  4. AD域控exchange邮箱(三)——exchange2010卸载报错的解决方法全纪录
  5. ubuntu使用之-rime
  6. 读书笔记_量化交易如何建立自己的算法交易04
  7. 读书笔记_中国期货市场量化交易(李尉)02
  8. 海岸鸿蒙甲醇中8种苯系物,甲醇中8种苯系物混合溶液标准物质-8种VOC
  9. oracle+执行变量语句,ORACLE sql 语句的执行过程(SQL性能调整)
  10. html改变微信标题栏颜色,带你了解微信在线编辑器的颜色样式修改