`
cantellow
  • 浏览: 848304 次
  • 性别: Icon_minigender_1
  • 来自: 草帽海贼团
社区版块
存档分类
最新评论

C++的拷贝构造函数

    博客分类:
  • C++
 
阅读更多

 

package com.cantellow.test;

import java.util.Vector;

public class Test {

    public static void main(final String[] args) {
        final String a = "2";
        String b = a;
        b = "7";
        System.out.println(a);
        System.out.println(b);

        final JavaClass jc = new JavaClass("qqqqqq");
        JavaClass jc2 = jc;
        jc2 = new JavaClass("wwwwwwwwww");
        System.out.println(jc);
        System.out.println(jc2);

        final JavaClass jc3 = new JavaClass("rrrrrrrrr");
        final JavaClass jc4 = jc3;
        jc4.setS("tttttt");
        System.out.println(jc3);
        System.out.println(jc4);

        final JavaClass jc5 = new JavaClass("test vector");
        System.out.println(jc5.getVs());
        jc5.setVs(new Vector<String>());
        jc5.getVs().add("v1");
        System.out.println(jc5.getVs());
    }
}

class JavaClass {

    private String s;

    private Vector<String> vs;

    public JavaClass(final String s) {
        this.s = s;
    }

    public synchronized String getS() {
        return s;
    }

    public synchronized void setS(final String s) {
        this.s = s;
    }

    public synchronized Vector<String> getVs() {
        return vs;
    }

    public synchronized void setVs(final Vector<String> vs) {
        this.vs = vs;
    }

    @Override
    public String toString() {
        return s;
    }

}

 java的类型系统,java除了几个基本类型之外,并没有引用和指针的区分,并不像C++一样,加上&*就是一种新的类型,而且java的基本类型都是值传递和赋值,非基本类型则是引用传递,但string比较特殊,因为其本身的实现,看起来它的行为基本类型表现一样。

java很简单,所有的对象都必须在堆上new(而不是C++还要区分栈对象和堆对象),我们不能直接操作这些对象,必须通过引用来达到目的,我记得think in java把对象比作电视机,把引用比作遥控器,我觉得很恰当:

上面的程序中,jcjc2某一时刻都指向统一个对象,但随后jc2指向了新的一个对象,所以输出不一样;

jc3jc4都指向同一个对象,而且通过jc4作为桥梁修改了这个对象的值,当然jc3所指向的对象也就变了,所以输出一样;

通过jc5我们可以知道两件事,第一件是对象初始类型为nullC++对象没有null概念,只有指针有),第二件就是java中的参数传递确实是引用传递。

 

 

#ifndef CPP_CLASS_H
#define CPP_CLASS_H
#include <string>
#include <vector>
#include <iostream>
using std::string;
using std::cout;
using std::endl;
class Object{
public:
	int i;
	Object(int i){
		this->i = i;
	}

	/*Object& operator=(const Object& t1){
		i = t1.i;
		return *this;
	}
	Object(const Object& o){
		this->i = o.i;
	}*/
};
class CPPClass{
public:
	CPPClass():o(1),s("ss"),vs(){
		
	}
	Object GetO() const { return o; }

	void SetO(Object val) { o = val; }

	string GetS() const { return s; }

	void SetS(string val) { s = val; }

	std::vector<string> GetVs() const { return vs; }

	void SetVs(std::vector<string> val) { vs = val; }

	Object o;
	string s;
	std::vector<string> vs;
private:

};
#endif

 main函数中:

 

#include "CPPClass.h"

int main(){
	CPPClass cpp;
	cout << &cpp.s << " " << &cpp.GetS() << endl;
	cout << &cpp.o << " " << &cpp.GetO() << endl;
	cout << &cpp.vs << " " << &cpp.GetVs() << endl;
}

 输出:

 

0018FEE8 0018FEC0

0018FEE4 0018FEBC

0018FF08 0018FEA8

 

要是在返回的类型前面加&,如下:

 

Object& GetO() { return o; }
string& GetS() { return s; }
std::vector<string>& GetVs() { return vs; }

 输出:

 

0018FEE8 0018FEE8

0018FEE4 0018FEE4

0018FF08 0018FF08

 

这表明加上&才是真正的返回对象里面的成员,那如果不加&就返回了一个新的对象,那这到底发生什么了呢?

实际上程序临时生成了一个对象,这个对象是通过拷贝构造函数生成的,我们再来看一下参数传递会发生什么事情:

 

        string s2;
	Object o2(7);
	std::vector<string> vs2;
	cpp.SetS(s2);
	cpp.SetO(o2);
	cpp.SetVs(vs2);

	cout << &s2 << " " <<  &cpp.s << endl;
	cout << &o2 << " " << &cpp.o << endl;
	cout << &vs2 << " " << &cpp.vs << endl;

 输出:

 

0018FEBC 0018FEE8

0018FEB0 0018FEE4

0018FE94 0018FF08

如果我们同样按照上次的方法将参数传递加一个&,会发生什么呢?

 

        void SetO(Object& val) { o = val; }
	void SetS(string& val) { s = val; }
	void SetVs(std::vector<string>& val) { vs = val; }

 输出:

 

0018FEBC 0018FEE8

0018FEB0 0018FEE4

0018FE94 0018FF08

并不像我们想的那样是一个地址,也就是他们不是同一个对象,那到底问题出在哪?

所有的这一切,牵涉除了两个概念:拷贝构造函数和操作符重载。

http://blog.csdn.net/lwbeyond/article/details/6202256

http://www.vckbase.com/index.php/wv/584

分享到:
评论

相关推荐

    C++拷贝构造函数和赋值操作

    ### C++拷贝构造函数与赋值操作详解 在C++编程中,拷贝构造函数与赋值操作是实现类的拷贝管理的关键机制。它们主要用于处理类的对象之间的拷贝和复制过程,尤其是在处理含有动态分配内存的类时尤为重要。 #### ...

    C++ 拷贝构造函数 赋值构造函数

    C++ 拷贝构造函数 赋值构造函数 解释

    C++拷贝构造函数详解1

    【C++拷贝构造函数详解】 C++中的拷贝构造函数是类的一个特殊构造函数,它的主要作用是在创建新对象时,将已有对象的内容复制到新对象中。这是类对象在某些特定情况下的必需操作,因为类对象通常具有更复杂的内部...

    C++简单类(构造函数,析构函数以及拷贝构造函数)的实现

    本文将详细解析一个简单的C++类`cPerson`的实现,重点关注其构造函数、析构函数以及拷贝构造函数。 ### 构造函数 构造函数是在创建类的对象时自动调用的一种特殊成员函数,主要用于初始化对象的数据成员。`cPerson...

    C++拷贝构造函数的介绍及使用

    C++中的拷贝构造函数是编程中不可或缺的一个概念,它在处理对象的复制和赋值操作时起到关键作用。拷贝构造函数是一个特殊类型的构造函数,它的任务是创建一个新对象,这个新对象是已有对象的一个副本。这种功能在...

    c++中拷贝构造函数实例

    在C++编程语言中,拷贝构造函数是一个特殊类型的构造函数,它的主要作用是初始化一个新对象为已存在对象的副本。这个过程被称为浅复制或深复制,具体取决于类的成员变量类型。对于初学者来说,理解拷贝构造函数的...

    详解C++ 拷贝构造函数

    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象。 复制对象把它作为参数传递给...

    详解C++ 拷贝构造函数和赋值运算符

    在C++编程中,拷贝构造函数和赋值运算符是两种重要的成员函数,它们用于处理对象间的值复制。这篇文章将深入探讨这两种机制的区别、调用条件以及深拷贝和浅拷贝的概念。 拷贝构造函数是一种特殊的构造函数,它接受...

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...

    C++面试试题-拷贝构造函数

    本题目旨在考察应聘者对C++拷贝构造函数的理解以及如何正确实现深拷贝(deep copy)的能力。 #### 代码分析 ##### 类定义 ```cpp class CInt { public: CInt(int *p) { m_p = p; } // 构造函数 CInt(const CInt ...

    c++拷贝构造函数(深拷贝,浅拷贝)详解.pdf

    c++拷贝构造函数(深拷贝,浅拷贝)详解.pdf

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

    C++类对象的拷贝构造函数 C++类对象的拷贝构造函数是一种特殊的构造函数,用于完成类对象之间的复制过程。与普通类型的对象不同,类对象内部结构一般较为复杂,存在各种成员变量,因此需要通过拷贝构造函数来完成...

    c/c++拷贝构造函数和关键字explicit详解

    C++中的拷贝构造函数和关键字explicit详解 C++中的拷贝构造函数是一种特殊的构造函数,它用于初始化对象时拷贝另一个对象的内容。拷贝构造函数的格式为`Type::Type(const Type&)`,其中`Type`是类的名称。拷贝构造...

    C++规定与类同名的函数就是拷贝构造函数

    当我们谈论“C++规定与类同名的函数就是拷贝构造函数”时,实际上是指一个类中定义的与类名相同且参数为该类类型的函数,这就是拷贝构造函数。 拷贝构造函数是一种特殊的构造函数,用于初始化一个新对象为已有对象...

    C++中拷贝构造函数的总结详解

    C++中的拷贝构造函数是面向对象编程中的一个重要概念,它是构造函数的一种特殊形式,主要负责处理类对象的复制和初始化。拷贝构造函数的名字与类名相同,但接受一个同类型的常量引用作为参数,这个参数是即将被复制...

    深入C++拷贝构造函数的总结详解

    拷贝构造函数是C++最基础的概念之一,大家自认为对拷贝构造函数了解么?请大家先回答一下三个问题:1. 以下函数哪个是拷贝构造函数,为什么?X::X(const X&); X::X(X); X::X(X&, int a=1); X::X(X&, int a=1, b=2);...

    C 拷贝构造函数.rar

    在C++编程语言中,拷贝构造函数是一个特殊类型的构造函数,它在对象间进行赋值或传递时被调用。拷贝构造函数的主要任务是初始化一个新对象,使其成为已存在对象的一个副本。理解拷贝构造函数对于深入掌握C++的内存...

    拷贝构造函数.rar

    拷贝构造函数是C++编程语言中的一个重要概念,它是一种特殊的构造函数,用于初始化一个新对象为现有对象的副本。这种特殊性体现在它的参数是一个同类型的引用,而且通常是const的,防止修改原对象。拷贝构造函数在...

Global site tag (gtag.js) - Google Analytics