C/C++(C++返回对象与应用区别,类成员的存储)
返回对象与应用区别:
拷贝构造器发生的时机:
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下的清屏cls
cout<<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,应当说明,常说的“某某对象的成员函数”,是从逻辑的角度而言的,而成员函数的存储方式,是从物理的角度而言的,二者是不矛盾的。类似于二维数组是逻辑概念,而物理存储是线性概念一样。
C/C++(C++返回对象与应用区别,类成员的存储)的更多相关文章
- PHP get_class 返回对象的类名
get_class (PHP 4, PHP 5) get_class — 返回对象的类名 说明 string get_class ([ object $obj ] ) 返回对象实例 obj 所属类的名 ...
- c++中返回对象与返回引用的区别
这几天在做用C++做课程设计,对其返回对象的实现感到迷惑. 通过对汇编代码的分析,可以清楚的看到,直接返回引用和返回对象的区别到底是什么. 分析的程序如下 #include<cstdio> ...
- Vue中data返回对象和返回值的区别
速记:粗浅的理解是,事件的结果是影响单个组件还是多个组件.因为大部分组件是要共享的,但他们的data是私有的,所以每个组件都要return一个新的data对象 返回对象的时候 <!DOCTYPE ...
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数
文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法 先创建一个对象函数 function Obj() { this.addre ...
- JS对象与Dom对象与jQuery对象之间的区别
前言 通过问题看本质: 举例: js的写法:document.getElementById('save').disabled=true; 在jquery中我是这样写的 $("#save&qu ...
- 二.OC基础--1,对象的存储细节,2,#pragma mark指令,3,函数和对象方法的区别,4,对象和方法之间的关系 ,5.课堂习题
1,对象的存储细节, 1. 当创建一个对象的时候:Person *p1 = [Person new],做了三件事情: 1,申请堆内存空间: 2,给实例变量初始化: 3,返回所申请空间的首地址; 2. ...
- js通过方法返回对象的注意点
问题:js通过方法返回一个字面量对象和返回一个提前已经定义好的字面量对象有区别吗? 答案:有 我们先来看看第一种情况,fun1方法返回一个提前没定义的字面量对象,然后通过调用方法返回三个对象,分别是o ...
随机推荐
- 【转】C# 正则表达式大全
[转]C# 正则表达式大全 前言 在网上看到一个不错的简易版正则匹配和替换的工具,现在补充进来,感觉还不错,效果如下(输入验证中文汉字的正则表达式) 在线下载 密码:5tpt 注:好像也是一位园友 ...
- Eclipse中JSON文件报错,如何解决?
eclipse里面的JSON文件老报错,虽然可以正常运行,但红X看起来就是不爽,怎么解决呢? 这是因为Eclipse认为JSON文件不需要注释,所以报的编译错误,我们可以通过Eclipse的设置把它的 ...
- Redhat 6配置本地Yum源
注明:我的方法适用于iso镜像(光盘或光盘镜像:iso9660) 1.挂载(mount) 其它的mount方法可參见此链接 http://www.jb51.net/os/RedHat/1109.htm ...
- extjs Combox 调用数据
1方法一 从 json获取 var typeStore = new Ext.data.Store({ proxy : new Ext.data.HttpProxy({u ...
- Objects and values
If we execute these assignment statements: We know that a and b both refer to a string, but we don’t ...
- 从C到OCblocks语法的声明
在过去的一段时间,我开始从C的一些简单声明到更复杂的学习直到我开始学习了Objective-C中的blocks.我花了很长的一段时间去理解他并且认识到一旦你理解它是怎样组织的并且是怎样产 ...
- VMware Workstation pro14 虚拟机下安装CentOS6.8图文教程
转载收藏于 https://www.cnblogs.com/jepson6669/p/8371823.html 1 启动VMware的画面 2.点击 创建新的虚拟机 3 选择 典型(推荐) 4 选择 ...
- hiho147周 - 数据结构 bitset
题目链接 n个5维数,对于每个数,输出小于他的数的个数(每个维度都比他小); #include <cstdio> #include <cstring> #include < ...
- hp服务器安装exsi5.5
启动按f8进入raid制造页面: 1. 插入exsi5.5光盘 2. 按下开机键(开机比较慢需要等待一段时间) 3. 进入启动项目界面(插入光盘后启动会让你选择启动项.选择1光盘启动) 接下来按 ...
- Debian9.5下ssh密钥登录配置步骤(免密码登录)和ssh-keygen 命令常用参数
密钥登录步骤(免密码登录)ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,出于安全方面的考虑,介绍密钥认证方式登录到linux/unix的方 ...