精华内容
下载资源
问答
  • 关于构造函数调用次数

    千次阅读 多人点赞 2019-05-30 15:12:50
    *c:定义指向类对象的指针,但没有进行实际的内存分配,所以不调用构造函数。 **d:定义指向类对象指针的指针,但没有进行实际的内存分配,所以不调用构造函数。 *e[2]:定义含有两个指向类对象的指针的数组,但没有...

    MyClass a:定义一个对象,调用1次构造函数。
    b[2]:定义含有两个元素的数组,实际上定义两个对象,所以调用2次构造函数。
    *c:定义指向类对象的指针,但没有进行实际的内存分配,所以不调用构造函数。
    **d:定义指向类对象指针的指针,但没有进行实际的内存分配,所以不调用构造函数。
    *e[2]:定义含有两个指向类对象的指针的数组,但没有进行实际的内存分配,所以不调用构造函数。
    *f=new char A:这个语句有问题,f是指向MyClass的对象,你却让它指向char类型的变量。应该改成:*f=new MyClass,涉及到内存的分配,调用1次构造函数。
    *g=new MyClass [2],涉及到内存的分配,调用2次构造函数。
    总结:只有涉及到内存分配的时候,才会调用构造函数。普通对象调用一次,对象数组调用N次(该数组含有N个元素)。只定义指针而不给指针赋值,则不涉及内存分配,不调用构造函数。

    转自:网页链接

    展开全文
  • c++ 构造函数详解

    万次阅读 多人点赞 2019-05-31 17:20:58
    c++构造函数详解。(构造函数的分类、拷贝构造函数

    c++ 构造函数详解

    构造函数是干什么的

    • 该类对象被创建的时候,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员

    构造函数的分类

    • 无参构造函数
    • 带默认值的构造函数
    • 有参(无默认值)的构造函数
    • 复制构造函数(拷贝构造函数)
      • 一种特殊的构造函数,当对象之间复制时会自动调用拷贝构造函数
      • 若类中没有显示定义拷贝构造函数,则系统会自动生成默认拷贝构造函数
    	#include <iostream>
    	using namespace std;
    	
    	class Coordinate
    	{
    	public:
    		// 无参构造函数
    		// 如果创建一个类你没有写任何构造函数,则系统自动生成默认的构造函数,函数为空,什么都不干
    		// 如果自己显示定义了一个构造函数,则不会调用系统的构造函数
    		Coordinate()
    		{
    			c_x = 0;
    			c_y = 0;
    		}     
    	
    		// 一般构造函数
    		Coordinate(double x, double y):c_x(x), c_y(y){}   //列表初始化
    		// 一般构造函数可以有多个,创建对象时根据传入的参数不同调用不同的构造函数
    	
    		Coordinate(const Coordinate& c)
    		{
    			// 复制对象c中的数据成员
    			c_x = c.c_x;
    			c_y = c.c_y;
    		}
    	
    		// 等号运算符重载
    		Coordinate& operator= (const Coordinate& rhs)
    		{
    			// 首先检测等号右边的是否就是等号左边的对象本身,如果是,直接返回即可
    			if(this == &rhs)
    				return* this;
    			// 复制等号右边的成员到左边的对象中
    			this->c_x = rhs.c_x;
    			this->c_y = rhs.c_y;
    			return* this;
    		}
    	
    		double get_x()
    		{
    			return c_x;
    		}
    	
    		double get_y()
    		{
    			return c_y;
    		}
    	
    	private:
    		double c_x;
    		double c_y;
    	};
    	
    	int main()
    	{
    		// 调用无参构造函数,c1 = 0,c2 = 0
    		Coordinate c1, c2;
    		// 调用一般构造函数,调用显示定义构造函数
    		Coordinate c3(1.0, 2.0);
    		c1 = c3;    //将c3的值赋值给c1,调用"="重载
    		Coordinate c5(c2);
    		Coordinate c4 = c2;    // 调用浅拷贝函数,参数为c2
    		cout<<"c1 = "<<"("<<c1.get_x()<<", "<<c1.get_y()<<")"<<endl
    			<<"c2 = "<<"("<<c2.get_x()<<", "<<c2.get_y()<<")"<<endl
    			<<"c3 = "<<"("<<c3.get_x()<<", "<<c3.get_y()<<")"<<endl
    			<<"c4 = "<<"("<<c4.get_x()<<", "<<c4.get_y()<<")"<<endl
    			<<"c5 = "<<"("<<c5.get_x()<<", "<<c5.get_y()<<")"<<endl;
    		return 0;
    	}
    
    	c1 = (1, 2)
    	c2 = (0, 0)
    	c3 = (1, 2)
    	c4 = (0, 0)
    	c5 = (0, 0)
    	请按任意键继续. . .
    

    拷贝构造函数

    • 拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类型的引用。当定义一个新对象并用同一类型的对象都它进行初始化时,将显示使用拷贝构造函数,当该类型的对象传递给函数返回该类型的对象时,将隐式调用拷贝构造函数
    • 当类中有一个数据成员是指针时,或者有成员表示在构造函数中分配的其他资源,必须显示定义拷贝构造函数
    • 构造函数的使用情况
      • 一个对象以值传递的方式传入函数体
      • 一个对象以值传递的方式从函数体返回
      • 一个对象需要通过另一个对象进行初始化
    	#include <iostream>
    	using namespace std;
    	
    	class Test
    	{
    	public:
    		// 构造函数
    		Test(int a):t_a(a){
    		cout<<"creat: "<<t_a<<endl;
    		}
    	
    		// 拷贝构造函数
    		Test(const Test& T)
    		{
    			t_a = T.t_a;
    			cout<<"copy"<<endl;
    		}
    	
    		// 析构函数
    		~Test()
    		{
    			cout<<"delete: "<<t_a<<endl;
    		}
    	
    		// 显示函数
    		void show()
    		{
    			cout<<t_a<<endl; 
    		}
    	
    	private:
    		int t_a;
    	};
    	
    	// 全局函数,传入的是对象
    	void fun(Test C)
    	{
    		cout<<"test"<<endl;
    	}
    	
    	int main()
    	{
    		Test t(1);
    		// 函数中传入对象
    		fun(t);
    		return 0;
    	}
    
    	creat: 1
    	copy
    	test
    	delete: 1
    	delete: 1
    	请按任意键继续. . .
    

    浅拷贝与深拷贝

    • 浅拷贝
      • 所谓浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。也就是增加了一个指针,指向原来已经存在的内存。 正常情况下,“浅拷贝”已经能很好的工作,但是一旦对象存在动态成员,浅拷贝就会出问题。让我们考虑下面一段代码:
    	#include <iostream>
    	#include <assert.h>    
    	using namespace std;
    	
    	class Test
    	{
    	public:
    		Test(){
    			p = new int(10);
    		}
    	
    		~Test(){
    			assert(p != NULL);     // assert()作用是如果他的条件返回错误,则终止程序执行 
    			delete p;
    		}
    	private:
    		int x;
    		int y;
    		int* p;
    	};
    	
    	int main()
    	{
    		Test t1;
    		Test t2(t1);    // 调用默认拷贝构造函数
    		return 0;
    	}
    

    上述程序崩溃。在使用t1复制t2时,进行的是浅拷贝,只是将成员的值进行赋值。此时,t1.p = t2.p, 即两个指针指向了堆里的同一个空间。这样,析构函数会被调用两次,这就是错误出现的原因。此问题的解决方法是“深拷贝”。

    • 深拷贝
      • 深拷贝就是对于对象中的动态成员,并不只是简单的赋值,而是重新分配空间,即资源重新分配。上述代码处理如下:
    	#include <iostream>
    	#include <assert.h>    
    	using namespace std;
    	
    	class Test
    	{
    	public:
    		Test(){
    			x = 0;
    			y = 0;
    			p = new int(10);
    		}
    	
    		Test(const Test& t)
    		{
    			x = t.x;
    			y = t.y;
    			p = new int(10);
    			*p = *(t.p);
    		}
    	
    		~Test(){
    			assert(p != NULL);     // assert()作用是如果他的条件返回错误,则终止程序执行 
    			delete p;
    		}
    	
    		int get_x(){return x;}
    		int get_y(){return y;}
    	private:
    		int x;
    		int y;
    		int* p;
    	};
    	
    	int main()
    	{
    		Test t1;
    		Test t2(t1);    // 调用默认拷贝构造函数
    		cout<<"("<<t1.get_x()<<", "<<t1.get_y()<<")"<<endl
    			<<"("<<t2.get_x()<<", "<<t2.get_y()<<")"<<endl;
    		return 0;
    	}
    
    (0, 0)
    (0, 0)
    请按任意键继续. . .
    

    此时t1与t2的p各自指向一段内存空间,但他们指向的内容相同,这就是“深拷贝”。

    展开全文
  • c#构造函数调用含参构造函数

    千次阅读 2018-10-25 09:20:17
    话不多说,直接上代码: public class Test ...经过代码测试知道上面的含参构造函数在第一个构造函数调用的,冒号后面为传的参数的值,构造函数没有返回值,这样便实现了实例化类时给类的属性赋值。

    话不多说,直接上代码:

    public  class Test
        {
            private string _testname;
            public string testname
            {
                set { _testname = value; }
                get { return _testname; }
            }
            public   Test():this("test")
            { }
            public   Test(string test)
            {
                this.testname = test;
            }
        }

    控制台:

     class Program
        {
            static void Main(string[] args)
            {
                DataHelp.Test test = new Test();
                Console.WriteLine(test.testname);
                Console.Read();
            }
        }

    经过代码测试知道上面的含参构造函数在第一个构造函数中调用的,冒号后面为传的参数的值,构造函数没有返回值,这样便实现了实例化类时给类的属性赋值。

    展开全文
  • c++构造函数中调用构造函数

    千次阅读 2019-02-27 19:21:01
     本人不是很懂c++,只是平时仿真的时候,用一点,对于其一些约定就不是很熟,于是今天就栽在一个bug上了。  示例代码如下: #include using namespace std; ...c++构造函数中调用构造函数

     本人不是很懂c++,只是平时仿真的时候,用一点,对于其一些约定就不是很熟,于是今天就栽在一个bug上了。
     示例代码如下:

    #include <iostream>
    using namespace std;
    class Sender{
    public:
        Sender(uint32_t number){
            Sender(number,1000);
        }
        Sender(uint32_t number,uint32_t mtu){
            m_number=number;
            m_mtu=mtu;
        }
        void Print(){
            std::cout<<m_number<<std::endl;
        }
    private:
        uint32_t m_number;
        uint32_t m_mtu;
    };
    int main(){
        Sender sender(10);
        sender.Print();
        return 0;
    }
    

     执行程序,Print函数输出的是一个很大垃圾数值。问题就是就出在析构代码,Sender(number,1000);调用完事之后,直接被析构了。

        Sender(uint32_t number){
            Sender(number,1000);
        }
    

     修改的做法:

    class Sender{
    public:
        Sender(uint32_t number):Sender(number,1000){
    
        }
        Sender(uint32_t number,uint32_t mtu){
            m_number=number;
            m_mtu=mtu;
        }
        void Print(){
            std::cout<<m_number<<std::endl;
        }
    private:
        uint32_t m_number;
        uint32_t m_mtu;
    };
    

    [1]c++构造函数中调用构造函数

    展开全文
  • Java构造函数中调用构造函数

    千次阅读 2019-07-22 23:44:39
    在Java中,当为一个类创建了多个构造函数时,有时想在一个构造函数调用另一个构造函数以减少代码量。这时可以使用this关键字来实现。通常,当使用this关键字时,它意味着“这个对象”或者“当前对象”,并且它自身...
  • C++构造函数详解及显示调用构造函数

    万次阅读 多人点赞 2018-10-08 10:55:11
    c++类的构造函数详解 一、 构造函数是干什么的 class Counter { public:  // 类Counter的构造函数  // 特点:以类名作为函数名,无返回类型  Counter()  {  ...
  • 创建对象时,会先自动调用父类的构造函数,再自动调用子类的构造函数。 解释:super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会...
  • 正确调用的方式是: 转载于:https://www.cnblogs.com/lz19980926/p/9013091.html
  • 构造方法用来初始化类的对象,与父类的其它...如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。   构造原则如下:    1. 如果子类没...
  • 构造函数调用虚函数

    千次阅读 2019-07-19 15:44:02
    最后调用构造函数{ }中的代码。由此可见调用this->fun( )时已经设定好虚表指针,所以调用不会有任何问题。之后B将虚表指针指向自己的虚表,初始化自己的成员变量,最后调用B(){ }中的代码this->fun( ),这个时候对象...
  • 构造函数调用几次

    千次阅读 2012-11-01 19:17:32
    *e[2]:定义含有两个指向类对象的指针的数组,但没有进行实际的内存分配,所以不调用构造函数。 *f=new char A:这个语句有问题,f是指向MyClass的对象,你却让它指向char类型的变量。应该改成:*f=new MyClass,...
  • 基类写了默认的构造函数,子类未明确调用 :(√) :这个情况,子类就可以默认调用到默认的构造函数 基类写了的默认构造函数,子类明确调用 :(√) :这个情况,子类就可以默认调用到默认的构造函数 基类没有写...
  • java构造函数调用

    千次阅读 2018-11-09 01:35:42
    构造函数调用,需要使用this关键字 this(); //调用无参构造函数Food() this(name); //调用有参构造函数Food(String name) 作用: 在一个构造函数调用另一个构造函数,主要是为了增加代码的复用性。 ...
  • C#从构造函数调用其他构造函数

    千次阅读 2019-06-22 18:14:42
    有时,在一个类中有构造函数,以容纳某些可选参数,这些构造函数包含一些共同的代码。例如,如下情况: Class Car { private string _description; private int _nWheels; public Car(string ...
  • 问题:如下两条语句的区别是什么? Student a; Student b(); 假设有一个Student类: class Student { private: int age;... // 不带参数的构造函数 Student() { this->age = 7; } //...
  • 拷贝构造函数 都是在什么情况下调用?... 什么时候调用拷贝构造函数 ** */ #include using namespace std; //日期类 class Date{ public: int year,month,day; Date(){//无参构造 cout 日期类的构造函数" <<
  • 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100;  int b = a;  而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个...
  • 1.c++编译器会自动调用构造函数//构造函数(与类名相同) //析构函数:没有参数也没有任何返回类型,被自动调用 #include&lt;iostream&gt; using namespace std; class Test { public: Test();//无参构造函数...
  • C++中显式指定调用父类的构造函数

    千次阅读 2019-04-13 00:50:20
    基类构造函数总是先于派生类构造函数调用。因为基类是派生类的基础,所以必须先创建基类。如果不指定要使用的基类构造函数,编译器就安排调用默认的基类构造函数。 规则:创建对象时首先调用基类的构造函数,然后...
  • java 调用类的构造函数

    千次阅读 2019-04-03 13:43:52
    构造函数1:通过参数传递书名给书名属性赋值; 构造函数2:通过参数传递书名、作者给相关属性赋值; 构造函数3:通过参数传递书名、作者、出版社给相关属性赋值; 构造函数4:通过参数传递书名、作者、出版社、价格...
  • c#的构造函数构造函数调用

    千次阅读 2015-12-01 16:53:07
    C#构造函数的特性一、 什么是C#构造函数?Construct,Function  C#构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.  C#构造函数具有一些特殊的性质:  (1)C#构造...
  •  //不能再非构造函数中使用this调用构造函数  System.out.println("petalCount = " + petalCount + "s = " + s);  }  public static void main(String[] args) {  // TODO Auto-generated method stub ...
  • 如果想调用父类中有参的构造函数,要在子类中构造函数后面加":base(继承父类的参数)",同时,在子类中构造函数中写自己独有的属性即可。 //举例子类中的base的使用 public Student ( string name , int age ...
  • new创建对象是否调用构造函数和析构函数

    千次阅读 多人点赞 2019-11-18 19:43:25
    1.指针不会调用构造和析构函数,只是定义了一个指针,没有申请内存:...使用new创建对象时,申请分配内存,调用构造函数: 当我们使用new为指针开辟空间,然后用delete释放掉空间会分别调用构造和析构函数: ...
  • 这句话就是说如果一个类有主构造函数,只要他还有次构造函数就必须调用构造函数,方式可以不同 方式1:每个次构造函数调用构造函数 class Parent(name: String) { var age = 0; va...
  • 如题, C++中派生类的构造函数一定得调用基类的构造函数吗 (小白刚学,大神勿喷)
  • 结论今天一反常态,先说结论——会!,探究这个问题的起因是工作中遇到了这个问题。本来记得new一个对象一般情况下会调用这个对象的构造函数,可是一时间记不清楚数组会不会调用了,于是决定试一下
  • class A { public A() { } public A(int A) :this() { } } 当A a=new A(1); 时 会先调用无参数的构造函数。在调用有参数那个
  • Java构造函数调用父类构造函数

    万次阅读 2016-09-21 09:54:39
    如果父类提供了无参数的构造函数,此时子类的构造函数就可以不显式的调用父类的构造函数,默认调用父类的无参构造函数。 package com.bjut.StudyTest; class Person { public Person() { Syste

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,199,928
精华内容 479,971
关键字:

如何判断调用了几次构造函数