-
C++ 各种构造函数的调用方式
2019-02-20 14:02:21c++的类中有5种值得注意的...这篇博客主要记录这3个构造函数、1个赋值函数的调用方式,希望大家学习之后,不但知道如何调用,还可以根据一句话来判断到底调用了几次构造函数。 可以通过一个例子来说明,假如我现在...c++的类中有5种值得注意的基本的函数:
- 无参构造函数
- 有参构造函数
- 拷贝构造函数
- 赋值函数
- 析构函数
关于析构函数,需要注意的点在上一篇博客里面 c++: 是否会自动delete? 也提到过了,在这里暂时不多说。这篇博客主要记录这3个构造函数、1个赋值函数的调用方式,希望大家学习之后,不但知道如何调用,还可以根据一句话来判断到底调用了几次构造函数。
可以通过一个例子来说明,假如我现在有一个Animal类,其中为了调试,我特意在每个构造函数中加入了输出语句,来看看调用的结果:
struct Animal {
int age;
string name;Animal() { // 无参构造函数
cout << "No-args Constructor" << endl;
age = -1;
name = "Unknown";
}Animal(string name, int age) { // 有参构造函数
cout << "Argumenting Constructor" << endl;
this->name = name;
this->age = age;
}Animal(const Animal &other) { // 拷贝构造函数
cout << "Copy constructor" << endl;
this->name = other.name;
this->age = other.age;
}Animal& operator=(const Animal &other) { // 赋值函数
cout << "Assigning" << endl;
this->name = other.name;
this->age = other.age;
}~Animal() {
cout << "Destructor" << endl;
}friend ostream& operator<<(ostream &out, const Animal &animal) {
out << "Animal[" << animal.name << "]: " << "age=" << animal.age;
return out;
}
};
然后,以下代码会演示创建一个实例的多种方式,并且我把每一种创建方式的输出结果、以及一些思考,以注释的方式写出来:int main() {
//-----------------无参构造函数-----------------------Animal animal01; // 虽然不是很明显,但是这里不是使用指针,而是直接操作实例,所以这里实际上调用了无参构造函数。
cout << animal01 << endl;
/*
输出:
No-args Constructor
Animal[Unknown]: age=-1
*/
Animal animal02(); // 这并不能调用无参构造函数!编译器会当作是某个函数的声明,所以下面输出的1也许是函数的地址(暂时没有深究)。
cout << animal02 << endl;
/*
输出:
1
*/
Animal animal03 = Animal();
// 注意,这里可能有人会认为:等号右边调用了默认构造函数,然后因为赋值给左边所以又调用了一次拷贝构造函数,就会认为这样子会白白浪费掉一个实例。
// 实际上,根据输出可以看到,结果并不是上述那样,而是这个语句整体上只调用了一次无参构造函数。即与“Animal animal03;”效果一样。
cout << animal03 << endl;
/*
输出:
No-args Constructor
Animal[Unknown]: age=-1
*///----------------------------------------------
//-----------------有参构造函数-----------------------Animal animal001("Lion", 1);
cout << animal001 << endl;
/*
输出:
Argumenting Constructor
Animal[Lion]: age=1
*/
Animal animal002 = Animal("Lion", 1);
// 这里同上面所说的,整体上仅仅调用了一次有参构造函数。
cout << animal002 << endl;
/*
输出:
Argumenting Constructor
Animal[Lion]: age=1
*///----------------------------------------------
//----------------拷贝构造函数-------------------Animal animal0001 = animal001;
// 这里要区分“拷贝构造函数”和“赋值函数”的调用时机。前者是声明和赋值在同一行,后者不是。所以这里属于拷贝构造函数。
cout << animal0001 << endl;
/*
输出:
Copy constructor
Animal[Lion]: age=1
*///-------------------------------------------
//------------------赋值函数------------------------Animal animal;
animal = animal0001;
// 因为这里animal的声明和赋值不在同一行,所以编译器会认为不是拷贝构造,而是一般的赋值语句。
cout << animal << endl;
/*
输出:
No-args Constructor
Assigning
Animal[Lion]: age=1
*///-----------------------------------
return 0;
}
---------------------
转自: https://blog.csdn.net/vitalemon__/article/details/60869721 -
c++:(各种)构造函数的调用方式
2018-11-05 20:46:29这篇博客主要记录这3个构造函数、1个赋值函数的调用方式,希望大家学习之后,不但知道如何调用,还可以根据一句话来判断到底调用了几次构造函数。 可以通过一个例子来说明,假如我现在有一个A...c++的类中有5种值得注意的基本的函数:
- 无参构造函数
- 有参构造函数
- 拷贝构造函数
- 赋值函数
- 析构函数
关于析构函数,需要注意的点在上一篇博客里面 c++: 是否会自动delete? 也提到过了,在这里暂时不多说。这篇博客主要记录这3个构造函数、1个赋值函数的调用方式,希望大家学习之后,不但知道如何调用,还可以根据一句话来判断到底调用了几次构造函数。
可以通过一个例子来说明,假如我现在有一个Animal类,其中为了调试,我特意在每个构造函数中加入了输出语句,来看看调用的结果:
struct Animal { int age; string name; Animal() { // 无参构造函数 cout << "No-args Constructor" << endl; age = -1; name = "Unknown"; } Animal(string name, int age) { // 有参构造函数 cout << "Argumenting Constructor" << endl; this->name = name; this->age = age; } Animal(const Animal &other) { // 拷贝构造函数 cout << "Copy constructor" << endl; this->name = other.name; this->age = other.age; } Animal& operator=(const Animal &other) { // 赋值函数 cout << "Assigning" << endl; this->name = other.name; this->age = other.age; } ~Animal() { cout << "Destructor" << endl; } friend ostream& operator<<(ostream &out, const Animal &animal) { out << "Animal[" << animal.name << "]: " << "age=" << animal.age; return out; } };
然后,以下代码会演示创建一个实例的多种方式,并且我把每一种创建方式的输出结果、以及一些思考,以注释的方式写出来:
int main() { //-----------------无参构造函数----------------------- Animal animal01; // 虽然不是很明显,但是这里不是使用指针,而是直接操作实例,所以这里实际上调用了无参构造函数。 cout << animal01 << endl; /* 输出: No-args Constructor Animal[Unknown]: age=-1 */ Animal animal02(); // 这并不能调用无参构造函数!编译器会当作是某个函数的声明,所以下面输出的1也许是函数的地址(暂时没有深究)。 cout << animal02 << endl; /* 输出: 1 */ Animal animal03 = Animal(); // 注意,这里可能有人会认为:等号右边调用了默认构造函数,然后因为赋值给左边所以又调用了一次拷贝构造函数,就会认为这样子会白白浪费掉一个实例。 // 实际上,根据输出可以看到,结果并不是上述那样,而是这个语句整体上只调用了一次无参构造函数。即与“Animal animal03;”效果一样。 cout << animal03 << endl; /* 输出: No-args Constructor Animal[Unknown]: age=-1 */ //---------------------------------------------- //-----------------有参构造函数----------------------- Animal animal001("Lion", 1); cout << animal001 << endl; /* 输出: Argumenting Constructor Animal[Lion]: age=1 */ Animal animal002 = Animal("Lion", 1); // 这里同上面所说的,整体上仅仅调用了一次有参构造函数。 cout << animal002 << endl; /* 输出: Argumenting Constructor Animal[Lion]: age=1 */ //---------------------------------------------- //----------------拷贝构造函数------------------- Animal animal0001 = animal001; // 这里要区分“拷贝构造函数”和“赋值函数”的调用时机。前者是声明和赋值在同一行,后者不是。所以这里属于拷贝构造函数。 cout << animal0001 << endl; /* 输出: Copy constructor Animal[Lion]: age=1 */ //------------------------------------------- //------------------赋值函数------------------------ Animal animal; animal = animal0001; // 因为这里animal的声明和赋值不在同一行,所以编译器会认为不是拷贝构造,而是一般的赋值语句。 cout << animal << endl; /* 输出: No-args Constructor Assigning Animal[Lion]: age=1 */ //----------------------------------- return 0; } 原文地址:https://blog.csdn.net/vitalemon__/article/details/60869721
-
重楼《辅_助是如何炼成的》游戏辅助原版视频+工具.txt
2020-07-28 16:45:16课程内容:今天我们要实现智能加血,什么是智能加血呢,我们要自动判断背包里哪个物品是药,那么如何判断呢,首先我们尝试了类型的判断发现补蓝和补血的类型名字一样,那么排除掉,那样的话我们只好用名字匹配了,幸好这个... -
网易——我的霸王笔
2008-09-26 10:54:00网易的2009校园招聘今天在我们学校举行笔试,没有接到笔试通知,继上次霸王笔之后,第二次靠软磨硬泡得到了一次笔试机会...C++中的new为对象分配内存,并且调用构造函数初始化,如何只调用构造函数不分配内存?Linux里面网易的2009校园招聘今天在我们学校举行笔试,没有接到笔试通知,继上次霸王笔之后,第二次靠软磨硬泡得到了一次笔试机会。
说题目吧,很杂,先是几个基础题,排序的时间复杂度,哈希表冲突处理的原理,对链表的优化提高其随机访问的性能。什么是NP问题,如何判断是否为NP问题。什么是C++ traits?请举例。C++中的new为对象分配内存,并且调用构造函数初始化,如何只调用构造函数不分配内存?
Linux里面考的是查找,sed字符串替换,用一条命令创建3个子目录,mount,设置ulimit。用户HOME目录下的.bashrc和bash_profile文件的功能有什么区别,gdb调试的一些问题,设置断点什么的。
pthread里面的函数名字,举出5个,线程同步机制,编译加什么参数。
数据库查找满足某条件的前5条记录。
首先要定义一个排序规则,有了排序规则才有前5条记录的说法。
SELECT * FROM (SELECT * FROM TB_NAME ORDER BY COL_1 DESC) WHERE ROWNUM < 6
基于哈希的索引和基于树的索引有何区别。
索引对数据库性能的影响。
什么是两阶段提交协议。
数据库的ACID性质,事务隔离的4个级别,并发控制协议。
连接池的作用,对系统性能的影响。
web开发
HTTP Request头字段有哪些?
web服务器如何区分普通用户和搜索引擎spider。
HTTP keep_alive的作用。
暂时就能想起这么多了。补充一个程序输出:
#include<iostream>
using namespace std;class A{
public:
A(){p();}
void p(){printf("A");}
virtual ~A(){p();}
};class B:public A{
public:
B(){p();}
void p(){printf("B");}
~B(){p();}
};int main()
{
A *a= new B();
delete a;
return 0;
}输出:ABBA
一个链表的遍历,声明是这样的:
void print(list<int> &l);
void print(list<int> &l)
{
list<int>::iterator it;
for(it=l.begin(); it!=l.end(); it++)
{
cout<<*it<<endl;
}
}还有一个是树的按层次输出,也是程序写结果的。
另外一个是比较类A,B,C的大小,如下:
class A{
A(){}
~A(){}
int m1;
int m2;
};class B{
B(){}
~B(){}
int m;
char a;
static char c;
};class C{
C(){}
virtual ~C(){}
int m1;
short s1;
};sizeof(A)=8;
sizeof(B)=8;
sizeof(C)=12.
一个工程有两个C文件分别为a.c, b.c,在a.c里面声明了一个全局变量foo,在b.c里面如何使用。
假设在a.c中这样声明:int foo;
在b.c中这样使用:extern int foo;
-
从如何停掉 Promise 链说起
2021-01-02 12:02:19甚至是不同的Promise之间相互调用,都可以达到目的。 然而这个方案有一个不那么明显的缺陷,那就是会造成潜在的内存泄露。 试想,当你把回调函数传给Promise的then方法后,如果这时Promise... -
MFC的程序框架剖析
2015-03-05 09:53:19”因此所有窗口类的窗口过程函数都是DefWindowProc,这一点在后面的跟踪中可以看到,每次生成窗口之后都会调用几次DefWindowProc函数。也就是说MFC都是让我们采用默认的窗口过程函数,这并不是说我们因此就不能使用... -
C语言程序设计标准教程
2009-05-22 18:41:51'Next of Page在C语言中,可以用以下几种方式调用函数: 1.函数表达式 函数作表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如: z=max(x,y)是一个赋值表达式,... -
你必须知道的495个C语言问题
2015-10-16 14:14:281.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 *1.26 main的正确定义是什么?voidmain正确吗? 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 1.28 文件中的... -
你必须知道的495个C语言问题(高清版)
2010-03-31 16:24:091.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确定义是什么?void main正确吗? 15 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 ... -
《你必须知道的495个C语言问题》
2010-03-20 16:41:181.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确定义是什么?void main正确吗? 15 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 ... -
语言程序设计课后习题答案
2012-12-27 17:02:37语句if(x == 3)首先判断x的值是否为3,若相等条件表达式的值为ture,否则为false。 2-15 什么叫做作用域?什么叫做局部变量?什么叫做全局变量,如何使用全局变量? 解: 作用域是一个标识符在程序正文中有效的... -
4.1.4 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。 4.1.5 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么...
-
C/C++程序员面试指南.杨国祥(带详细书签).pdf
2018-04-08 02:46:41面试题9:简述子类与父类的析构、构造函数的调用顺序 面试题10:编写类String 的构造函数、析构函数和赋值函数 8.4 拷贝构造函数 面试题11:谈谈对拷贝构造函数和赋值运算符的认识 面试题12:写出当定义#define _... -
Visual C++ 2008入门经典--详细书签版
2013-02-02 16:07:157.11.3 定义引用类类型的复制构造函数 335 7.11.4 类属性 336 7.11.5 initonly字段 348 7.11.6 静态构造函数 349 7.12 小结 350 7.13 练习 351 第8章 深入理解类 352 8.1 类的析构函数 352 8.1.1 析构函数的... -
C语言FAQ 常见问题列表
2010-10-28 16:41:29o 2.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。 o 2.9 main() 的正确定义是什么? void main() 正确吗? o 2.10 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为 ``... -
Visual C++ 2008入门经典--源代码及课后练习答案
2013-02-02 16:13:257.11.3 定义引用类类型的复制构造函数 335 7.11.4 类属性 336 7.11.5 initonly字段 348 7.11.6 静态构造函数 349 7.12 小结 350 7.13 练习 351 第8章 深入理解类 352 8.1 类的析构函数 352 8.1.1 析构函数的... -
Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好
2011-01-28 17:02:0810.在logindlg.cpp 的loginDlg 类构造函数里,添上初始化语句,使密码显示 为小黑点。 loginDlg::loginDlg(QWidget *parent) : QDialog(parent), m_ui(new Ui::loginDlg) { m_ui->setupUi(this); m_ui->pwdLineEdit-... -
JAVA面试题最全集
2010-03-13 13:09:10如何构造一棵树?选择树的一个节点时,如何得到这个节点? 70.向编辑框中输入字符时,如何控制只输入整数? 71.描述使用JDBC连接数据库的过程 72.EJB分为几类?什么是BMP,CMP? 73.什么是JNDI? 74.ADO是什么?... -
VC++科学计算器的设计V1_4Beta.rar
2010-03-23 04:54:59但是,算法仅仅给出了一个笼统的实现策略,对于具体的数据类型、运算操作符及优先级情况、怎样支持函数调用、自定义内存变量如何实现等具体问题并无现成的解决方案,需要开发人员自己实际设计相应的算法解决,而这也... -
拿到毕业证第二天突然“收到”阿里社招面试通知
2020-11-28 23:00:48“函数与构造函数的区别” 个人认为这个问题可以归结为,函数为普通函数调用和用作构造器调用时的区别。而最大的区别就是在普通函数调用时其内部this指向了全局对象。如果是浏览器中运行那么这个对象就是... -
java面试题
2018-01-01 15:35:1530. 构造器Constructor是否可被override 15 31. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 16 32. 应用服务器与WEB SERVER的区别? 16 ... -
前端开发基础-JavaScript
2020-11-20 18:08:12创建数组可以使用构造函数的方式也可以使用字面量的形式,另外可以使用concat从一个数组中复制一个副本出来。数组本身提供了很多方法让开发者使用来操作数组。 - length 数组的长度 - toString 可以返回一个以... -
华为编程开发规范与案例
2008-09-04 16:44:56在一次测试中,并没有记得做了什么操作,发现HONET系统的主机复位了,之后,系统又工作正常了。由于没有打开后台的跟踪窗口,当时查了半天没有眉目。过了半天,现象又出现了,而且这次是主机在反复复位,系统根本... -
JSTL详细标签库介绍
2010-11-01 16:37:44浏览次数:791次 height="600">第16讲:异常处理<BR>16.1、简介:异常是程序执行时遇到的任何错误情况或意外行为。以下这些情况都可以引发异常:您的代码或调用的代码(如共享库)中有错误,操作系统资源不可用,... -
【。net 专业】 面试题
2010-05-19 14:48:46第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 ... -
你必须知道的495个C语言问题(PDF)
2009-09-15 10:25:471.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。. . 4 1.9 main() 的正确定义是什么? void main() 正确吗? . . . . . . . . . 4 1.10 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全 ... -
剖析 React 源码:先热个身
2020-11-28 06:20:30构造函数 <code>Component</code> 中需要注意的两点分别是 <code>refs</code> 和 <code>updater</code>,前者会在下文中专门介绍,后者是组件中相当重要的一个属性,我们可以发现 <code>setState...