利用无名对象初始化对象系统不会调用拷贝构造函数

#include <iostream>
using namespace std;  

class Internet
{
public:
    Internet(char *name,char *address)
    {
        cout<<"载入构造函数"<<endl;
        strcpy(Internet::name,name);
    }
    Internet(Internet &temp)
    {
        cout<<"载入COPY构造函数"<<endl;
        strcpy(Internet::name,temp.name);
        cin.get();
    }
    ~Internet()
    {
        cout<<"载入析构函数!";
    }
public:
    char name[20];
    char address[20];
};  

void main()
{
    Internet a=Internet("中国软件开发实验室","www.cndev-lab.com");
    cout<<a.name;
    cin.get();
}

上面代码的运行结果有点“出人意料”,从思维逻辑上说,当无名对象创建了后,是应该调用自定义拷贝构造函数,或者是默认拷贝构造函数来完成复制过程的,但事实上系统并没有这么做,因为无名对象使用过后在整个程序中就失去了作用,对于这种情况c++会把代码看成是:
Internet a("中国软件开发实验室",www.cndev-lab.com);
省略了创建无名对象这一过程,所以说不会调用拷贝构造函数。转载自http://blog.sina.com.cn/s/blog_3c6889fe0100rp6q.html
时间: 2024-08-29 15:39:58

利用无名对象初始化对象系统不会调用拷贝构造函数的相关文章

初始化数组/容器时,调用默认构造函数还是复制构造函数

当使用数组或容器时,通常会预先分配一定容量.在分配的大小中,都会初始化容器的对象,在初始化第一个时,毫无疑问调用的是默认构造函数,但是当初始化第二个到最后一个时,应该怎么做? 很显然,数组/容器的对象都一模一样,一种方法是:开辟内存,然后在开辟的内存处调用默认构造函数:另一种方法是:开辟内存,构造一个对象,把对象拷贝n份到开辟的内存处(调用复制构造函数).从效率上来说,我认为第二种效率更高,因为调用默认构造的消耗一般大于调用复制构造函数.复制构造函数常常是浅拷贝,这样效率很高. 写代码测试一下,

对象初始化alloc和init嵌套调用的原因

在objective-c基础教程中有说到在初始化的时候务必要像下面这样的写法: Car *car = [[Car alloc] init]; 而不能这样写: Car *car = [Car alloc];[car init]; 这是因为初始化方法返回的对象可能与分配的对象不同,而这都是类簇所造成.下面就介绍下什么是类簇. 类簇,是由一个抽象的父类及一组私有化(private)的具体子类组成.程序员只能用父类对外提供的接口(interface)来生成类簇中某个具体的子类对象. 象类Number是类

C++ 函数返回对象时并没有调用拷贝构造函数

#include <iostream> #include <vector> #include <string.h> using namespace std; class CTest { public: CTest() { cout << "CTest construct" << endl; data = new char[10]; strncpy(data, "hello", 10); } CTest(co

main与对象初始化 in C++

没有学过代码编译的原理,以前也没有兴趣去学编译器的相关原理,但是近期通过阅读google开源项目gtest,对我稍有触动. 代码: main test示例 TEST宏定义 #define TEST(test_case_name, test_name)\GTEST_TEST_(test_case_name, test_name, \::testing::Test, ::testing::internal::GetTestTypeId()) GTEST_TEST_宏定义: #define GTEST

C#4.0语法糖之第三篇: 参数默认值和命名参数 对象初始化器与集合初始化器

今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完善以及自我提高,给各位园友们带来更好,更高效的文章. 废话就说到这里,下面正式进入我们的今天的C#4.0语法糖,今天给大家分享一下参数默认值.命名参数.对象初始化器和集合初始化器. 参数默认值和命名参数:方法的可选参数是.net 4.0最新提出的新的功能,对应简单的重载可以使用可选参数和命名参数混合

对象初始化的完整过程(C#)

1.静态构造函数 在引入本文的主题之前,我们先来铺垫一下吧,看看静态构造函数的概念及用途. C#中允许创建无参数构造函数,该函数仅执行一次.它一般被用来初始化静态字段.CLR不能保证在某个特定时刻执行静态构造函数,同时也不保证不同类的静态构造函数按照什么顺序执行,但保证它仅执行一次,即在应用程序创建该类的第一个实例或访问该类的任何静态成员之前. 注意,静态构造函数不允许有访问修饰符,且不接受任何参数,这是因为其他代码没有权利调用它,它的调用执行总是被CLR接管的!另外,一个类只能有一个静态构造函

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: #include <iostream>  using namespace std;    class Test  {  public:      Test(int temp)      {          p1=temp;      }  prote

Android SO逆向-对象的拷贝构造函数

0x00 这一节我们主要讨论对象的拷贝构造函数的汇编实现. 0x01 我们直接看C++代码: Test.h: #ifndef _TEST_H_ #define _TEST_H_ #include <android/log.h> #define LOG_TAG "lesson5" #define ALOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) class Test

C++类对象的拷贝构造函数分析

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CA{ public: CA(int b) { a=b; } void Show () { cout<<a<<endl; } private: int a;};int main(){