当前位置: 首页 > news >正文

网站权限怎么设置方法可以做样机图的网站

网站权限怎么设置方法,可以做样机图的网站,php 网站开发360,下列哪些属于营销型网站的基础建设构造函数和析构函数的调用时机 1. 对于全局定义的对象,每当程序开始运行,在主函数 main 接受程序控制权之前,就调 用构造函数创建全局对象,整个程序结束时,自动调用全局对象的析构函数。 2. 对于局部定义的对象&#…

构造函数和析构函数的调用时机

1. 对于全局定义的对象,每当程序开始运行,在主函数 main 接受程序控制权之前,就调
用构造函数创建全局对象,整个程序结束时,自动调用全局对象的析构函数。
2. 对于局部定义的对象,每当程序流程到达该对象的定义处就调用构造函数,在程序离开
局部对象的作用域调用对象的析构函数。
3. 对于关键字 static 定义的静态对象,当程序流程到达该对象定义处调用构造函数,在整
个程序结束时调用析构函数。
4. 对于用 new 运算符创建的堆对象,每当创建该对象时调用构造函数,在使用 delete 删
除该对象时,调用析构函数

拷贝构造函数回顾

在看调用时机之前,先回顾以下拷贝构造函数的定义:

拷贝构造函数的形式是固定的:类名(const 类名 &)
1. 该函数是一个构造函数 —— 拷贝构造也是构造!
2. 该函数用一个已经存在的同类型的对象,来初始化新对象,即对对象本身进行复制
没有显式定义拷贝构造函数,这条复制语句依然可以通过,说明编译器自动提供了默认的
拷贝构造函数。其形式是:

Point(const Point & rhs)
: _ix(rhs._ix)
, _iy(rhs._iy)
{}

但是默认的拷贝构造函数只能实现浅拷贝,无法对复杂的数据结构进行深拷贝,示例如下:

Computer pc("Acer",4500);
Computer pc2 = pc;//调用拷贝构造函数class Computer{
public:void print(){cout << "name:" << _name << endl;cout << "price:" << _price << endl;}
private:int _price;char *_name;  
};

编译可以通过,运行则会报错。

如果是默认的拷贝构造函数,pc2会对pc的_brand进行浅拷贝,指向同一片内存;pc2被销
毁时,会调用析构函数,将这片堆空间进行回收;pc再销毁时,析构函数中又会试图回收
这片空间,出现double free问题

如果拷贝构造函数需要显式写出时(该类有指针成员申请堆空间),在自定义的拷贝构造函数中要换成深拷贝的方式,先申请空间,再复制内容

Computer::Computer(const Computer & rhs)
: _brand(new char[strlen(rhs._brand) + 1]())
, _price(rhs._price)
{
strcpy(_brand, rhs._brand);
}

拷贝构造函数的调用时机

1. 当使用一个已经存在的对象初始化另一个同类型的新对象时
2. 当函数参数(实参和形参的类型都是对象),形参与实参结合时(实参初始化形参)
—— 为了避免这次不必要的拷贝,可以使用引用作为参数

注意:类内拷贝构造函数必须对形参使用使用,否则会陷入对拷贝的递归调用导致栈溢出。

3. 当函数的返回值是对象,执行return语句时(编译器有优化)。
——为了避免这次多余的拷贝,可以使用引用作为返回值,但一定要确保返回值的生命
周期大于函数的生命周期

拷贝构造函数的形式探究

拷贝构造函数是否可以去掉引用符号?

Point(const Point  rhs)
—— 类名(const 类名) 形式,首先编译器不允许这样写,直接报错
如果拷贝函数的参数中去掉引用符号,进行拷贝时调用拷贝构造函数的过程中会发生“实参
和形参都是对象,用实参初始化形参”(拷贝构造第二种调用时机),会再一次调用拷贝构
造函数。形成递归调用,直到栈溢出,导致程序崩溃。

拷贝构造函数是否可以去掉const?

Point(Point & rhs)—— 类名(类名 &) 形式
编译器不会报错
加const的第一个用意:为了确保右操作数的数据成员不被改变
加const的第二个用意:为了能够复制临时对象的内容,因为非const引用不能绑定临时变量(右值)

先看一个简单的示例,看看什么是临时的变量或对象:

参考:https://zhuanlan.zhihu.com/p/165391845

#include <iostream>
using namespace std;void f(int &a){cout << "f(" << a  << ") is being called" << endl;
}void g(const int &a){cout << "g(" << a << ") is being called" << endl;
}int main(){int a = 3, b = 4;f(a + b);  //编译错误,把临时变量作为非const的引用参数,传递给int &a了g(a + b);  //OK,把临时变量作为const&传递是允许的
}

上面的两个调用之前,a+b的值会存在一个临时变量中,因为a+b是一个表达式,本质上属于一个没有名字的变量,编译器会自动生成一个临时变量储存a+b的值,当把这个临时变量传给f时,由于f的声明中,参数是int&,不是常量引用,所以产生以下编译错误:

error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'

那么临时变量跟引用有什么关系?C++语法规定,const引用可以绑定右值,非const引用不能绑定右值。这里什么是左值和右值?

通俗的说,可以取地址的变量称为左值,反之则为右值。临时变量,匿名变量,临时对象,匿名对象他们在内存中并没有实际的内存分配,绝大多数情况下属于右值。对于没有实际存在于内存中的变量或对象,不允许直接对其进行引用,因为编译器认为引用的对象必须是内存中实体,面对这种情况,必须加const进行常量引用。

补充:【临时变量】不能作为【非const引用参数】,不是因为他是常量,而是因为c++编译器的一个关于语义的限制。如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且编译器认为临时变量不会常驻内存,随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制,意在限制这个非常规用法的潜在错误。

回到之前的拷贝构造函数,由之前的疑问可以得出,拷贝构造函数必须让对象包含引用符号。

又因非const引用不能绑定临时变量,所以对于拷贝构造函数必须进行const引用。

对于下图中的示例,右边的Computer实际并未被完全实例化,就直接拷贝给了pc3对象,属于一个临时对象,这条语句执行完就被释放掉了。所以必须是const引用。

http://www.dtcms.com/a/579770.html

相关文章:

  • 做视频网站 视频放在哪里找我做的网站怎么提升排名
  • 厦门市建设局北京网站seo服务
  • 网站建设的标签指的是手机购物网站开发教程
  • 开江网站建设wordpress revision
  • 网站系统建设项目微信网站 详解
  • 云南网站优化哪家好wordpress绑定熊掌号
  • 网站建设 参照 标准规范建立个人视频播放网站
  • 深圳专门做网站的公司有哪些宁乡做网站地方
  • 淘宝客如何建设推广网站百度指数预测
  • 网站规划与制作郑州流产最安全的医院
  • 做网站到底要不要备案51素材网
  • 中国建设银行西平支行网站设计图制作软件app手机
  • 无锡知名网站推广公司做网站的原因
  • 做网站推广优化哪家好wordpress固定连接怎么设置好
  • 深圳专业建站公司wordpress评论编辑器
  • 2008发布asp网站做网站和推广需要多少钱
  • 怎样创建旅游网站WordPress中文音乐主题
  • 如何做公司网站优化高校网站建设存在问题
  • 灰色关键词网站建设做网站的原型 免费
  • 网站后台上传图片步骤公章在线制作网站
  • 房地产数据网站不需要备案的服务器
  • 优秀的国外网站卖辅助网站怎么做
  • 滨海县城乡建设局网站游戏代理加盟
  • 江苏网站seo优化做网站需要服务器么
  • 手机网站建设流程 知乎平面设计图网站有哪些?
  • 做网站怎么找优质客户信用网站建设成效
  • 云建站网址找人做网站应该注意什么
  • 佛山网站建设企划动力十大室内设计师
  • 将网站加入小程序找不到自己做的dw网站
  • 国内阿里巴巴网站怎么做网站做等保测评