构造函数 订阅
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。 展开全文
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
信息
作    用
为对象成员变量赋初始值
语    句
new运算符一起使用
中文名
构造函数
外文名
constructor
构造函数主要特点
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)6.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。7.在Python中构造函数必须通过重写__init__方法实现
收起全文
精华内容
参与话题
问答
  • 构造函数

    千次阅读 2016-03-07 22:28:52
    构造函数  类通过一个或几个特殊的成员函数控制类对象初始化过程这样的成员函数为构造函数构造函数的函数名与类名相同,没有返回类型,不能声明为const成员函数(因为直到构造函数初始化过程后,对象才能真正的...

    构造函数

       类通过一个或几个特殊的成员函数控制类对象初始化过程这样的成员函数为构造函数。构造函数的函数名与类名相同,没有返回类型,不能声明为const成员函数(因为直到构造函数初始化过程后,对象才能真正的取得其常量属性)一个类中可以有多个构造函数。构造函数有一个初始化列表。

     

    &构造函数初始化列表:

      构造函数初始化时,每个成员函数只能初始化一次,虽然成员函数的形参顺序必须与实参顺序相同,但是构造函数的舒适化列表与顺序无关。(最好使构造函数的初始值列表与成员声明顺序相同。如果可能的话,应该尽量减少使用某些某些去初始化另外的成员)。

      构造函数的初始化与赋值不同,如果没有在构造函数初始化列表中显示的初始化成员,则该成员将在构造函数之前执行默认初始化,然后在函数体中如果有赋值操作,将用默认的初始化内容擦去,用新值代替。

     

     

    &默认构造函数:

       一般的类通过一个特殊的构造函数来是的数据成员初始化为默认值,这种构造函数就默认构造函数。当我们在类中没有显示的构造函数时,编译器就会隐式的定义一个默认构造函数成为合成的默认构造函数。这种合成的默认构造函数初始化规则就是 如果存在类内的初始值,用它来初始化,否则默认初始化该成员。显然如果类成员中油内置类型或复合类型,那么这些成员最好有初始值,否则生成的合成的默认构造函数可能会出现未定义的现象。如果类中有构造函数,同时也想享受合成的默认构造函数机制那么就用=default关键字。与此同时,如果类中有一个类类型数据成员,那么只有这个数据成员有合成默认构造函数时才能生成默认构造函数,否则不能生成。基于这种情况,如果向生命默认构函数,则直接列表初始化。

    &默认实参与构造函数:

      如果一个构造函数为所有的类成员提供了默认实参,那么实际上也就为类提供了默认构造函数。使用默认实参的作用之一是在于将默认构造函数与某些构造函数相结合。另一作用是对于部分不同数据成员的初始化对另外几个数据成员有着约束作用。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 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++ 拷贝构造函数

    万次阅读 2020-07-11 23:38:48
    #include<iostream> using namespace std;... "Person的无参构造函数调用" << endl; }; Person(int a) { age = a; cout << "Person的有参构造函数调用" << endl; }; .
    #include<iostream>
    using namespace std;
    #include<string>
    
    
    class Person {
    
    	int age;
    public:
    
    	Person() {
    		cout << "Person的无参构造函数调用" << endl;
    	};
    
    	Person(int a) {
    		age = a;
    		cout << "Person的有参构造函数调用" << endl;
    	};
    
    	
    
    	//拷贝构造函数
    	Person(const Person &p){
    		cout << "Person的拷贝构造函数调用" << endl;
    		//将传入的人身上的所有属性,拷贝到我身上
    		age = p.age;
    	//	m_Age = p.m_Age;
    	};
    
    	~Person() {
    	
    		cout << "Person的析构函数调用" << endl;
    	}
    
    	int m_Age;
    
    };
    
    
    void test() {
    
    	
    	//1.括号法
    	Person p1; //默认构造函数调用
    	Person p2(10); //有参构造函数
    	Person p3(p2); //拷贝构造函数
    
    	//2、显示法
    	//3、隐式转换法
    
    
    }
    
    
    //1、使用一个已经创建完毕的对象来初始化- -个新对象
    void test01() {
    	Person p1(20);
    	Person p2(p1);
    	cout << "P2的年龄为:" << p2.m_Age << endl;
    };
    
    //2、值传递的方式给函数参数传值
    void doWork(Person p) {
    }
    void test02(){
    	Person p;
    	doWork(p);
    }
    
    int main() {
    	test();
    
    //	test01();
    	system("pause");
    
    }
    
    

     

    #include<iostream>
    using namespace std;
    #include<string>
    
    
    class Person {
    
    public:
    
    	Person() {
    		cout << "Person的无参构造函数调用" << endl;
    	};
    
    	Person(int a) {
    		age = a;
    		cout << "Person的有参构造函数调用" << endl;
    	};
    
    	
    
    	//拷贝构造函数
    	Person(const Person &p){
    		cout << "Person的拷贝构造函数调用" << endl;
    		//将传入的人身上的所有属性,拷贝到我身上
    		age = p.age;
    	//	m_Age = p.m_Age;
    	};
    
    	~Person() {
    	
    		cout << "Person的析构函数调用" << endl;
    	}
    
    	int age;
    	int m_Age;
    
    };
    
    
    void test() {
    
    	
    	//1.括号法
    	Person p1; //默认构造函数调用
    	Person p2(10); //有参构造函数
    	Person p3(p2); //拷贝构造函数
    
    	
    	cout << "p2的年龄为 :" << p2.age << endl;
    	cout << "p3的年龄为 :" << p2.age << endl;
    
    	//2、显示法
    	//3、隐式转换法
    
    
    }
    
    
    //1、使用一个已经创建完毕的对象来初始化- -个新对象
    void test01() {
    	Person p1(20);
    	Person p2(p1);
    	cout << "P2的年龄为:" << p2.m_Age << endl;
    };
    
    //2、值传递的方式给函数参数传值
    void doWork(Person p) {
    }
    void test02(){
    	Person p;
    	doWork(p);
    }
    
    int main() {
    	test();
    
    //	test01();
    	system("pause");
    
    }
    
    

     

    展开全文
  • JAVA构造函数(方法)

    千次阅读 多人点赞 2018-12-27 14:47:11
    一、什么是构造函数 java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与类名相同,无返回值。 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。 构造函数是...

    一、什么是构造函数

    java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与类名相同,无返回值。

    作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。

    构造函数是对象一建立就运行,给对象初始化,就包括属性,执行方法中的语句。

    而一般函数是对象调用才执行,用".方法名“的方式,给对象添加功能。

     

     一个对象建立,构造函数只运行一次。

     而一般函数可以被该对象调用多次。

      

    二、构造函数的特点

    1、构造函数函数名与类名相同

    2、构造函数没有返回类型,如:String、void等

    3、构造函数在类中没有体现出来,则默认有一个不带形式参数的默认构造函数

     

    注:一般函数不能调用构造函数,只有构造函数才能调用构造函数。

     

     三、示例

    1、无参构造函数中只定义了一个方法。new对象时,就调用与之对应的构造函数,执行这个方法。不必写“.方法名”。 

    package com.example.constructor;
    
    public class ConstructorDemo {
    	public static void main(String[] args) {
    		Person person = new Person(); // 输出默认构造函数。new对象一建立,就会调用对应的构造函数Person(),并执行其中的打印输出语句。
    	}
    }
    
    class Person {
    	Person() { // 定义构造函数,输出"默认构造函数"
    		System.out.println("默认构造函数");
    	}
    }

    输出:

    默认构造函数

     

     2、有参构造函数,在new对象时,将实参值传给private变量,相当于完成setter功能。

    package com.example.constructor;
    
    public class ConstructorDemo {
    	public static void main(String[] args) {
    		// 实例化Person对象,传参name="zhangsan"、age=25
    		// 因Person类重载构造函数后,原来默认构造函数被覆盖,此时此处若不传形式参数,则会在编译时报错
    		Person person = new Person("zhangsan", 25);
    	}
    }
    
    class Person {
    	private String name;
    	private int age;
    
    	// 此处定义带有形参构造函数后,原来默认的无参构造函数则被覆盖掉
    	Person(String tname, int tage) {
    		name = tname;
    		age = tage;
    		System.out.println("名称:" + name + ",年龄:" + age);
    	}
    }

    输出:

    名称:zhangsan,年龄:25

     

    三、默认构造函数

    当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方便该类初始化。只是该空构造函数是隐藏不见的。

    如下,Person(){}这个默认构造函数是隐藏不显示的。

    class Person {
    	Person() {
    		//默认构造函数,默认不显示,若对构造函数重载后需要调用默认构造函数,则需显示定义默认构造函数
    	}
    }


    当在该类中自定义了构造函数,默认构造函数就没有了。

    如果仍要构造函数,则需要自己在类中显示定义默认构造函数。

     

    四、构造函数的重载

    构造函数也是函数的一种,同样具备函数的重载(Overloding)特性。

    package com.example.constructor;
    
    public class ConstructorDemo {
    	public static void main(String[] args) {
    		Person person1 = new Person();
    		Person person2 = new Person("lisi");
    		Person person3 = new Person(30);
    		Person person4 = new Person("lisi", 28);
    	}
    }
    
    class Person {
    	private String name;
    	private int age;
    
    	Person() {
    		System.out.println("名称:" + name + ",年龄:" + age);
    	}
    
    	Person(String tname) {
    		name = tname;
    		System.out.println("名称:" + name + ",  年龄:" + age);
    	}
    
    	Person(int tage) {
    		age = tage;
    		System.out.println("名称:" + name + ",年龄:" + age);
    	}
    
    	Person(String tname, int tage) {
    		name = tname;
    		age = tage;
    		System.out.println("名称:" + name + ",  年龄:" + age);
    	}
    }

    输出:

    名称:null,年龄:0
    名称:lisi,  年龄:0
    名称:null,年龄:30
    名称:lisi,  年龄:28

    展开全文
  • C++构造函数之委托构造函数

    千次阅读 2016-10-20 22:16:05
    C++11新标准扩展了构造函数初始值的功能,所以委托构造函数就出现了,一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程,或者说他把自己的一些(或全部)职责委托给了其他构造函数。 1.定义: ...
  • class MyClass{ int value; public: MyClass(int n):value(n){} ...我认为答案是A,但是很多书答案都是B,说是还有一个默认构造函数。已经定义了构造,怎么还会有默认构造,难道是默认复制?本人小白,求指教
  • 构造函数成员函数的一种,名字与类名相同,可以有参数,不能有返回值(void也不行)。 一个类可以有多个构造函数。 如果定义类时没写构造函数,则编译器生成一个默认的无参构造函数,这个构造函数不做任何操作。...
  • C++拷贝构造函数详解

    万次阅读 多人点赞 2011-02-23 13:39:00
    什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象...
  • C++ 类(构造函数和析构函数)

    万次阅读 多人点赞 2018-07-20 19:00:51
    构造函数和析构函数的由来? 构造函数和析构函数的基本语法 C++编译器构造析构方案 PK 对象显示初始化方案 构造函数的分类以及调用 默认的构造函数 构造函数调用规则 构造函数和析构函数的总结 构造函数和析构...
  • C++默认构造函数

    万次阅读 多人点赞 2018-02-08 12:43:51
    本文围绕3个问题来理解C++的默认构造函数: 什么是默认构造函数? 默认构造函数什么时候被调用? 编译器在什么情况下会生成默认构造函数? 一. 什么是默认构造函数? 我们一般会认为默认构造函数就是编译器...
  • 执行一次构造函数,两次拷贝构造函数,两次析构函数。这我可以理解。但是如果这样写 ``` A a; A b=show(a); ``` 执行了两次拷贝构造函数,和一次析构函数。这我有点不能理解。show函数中,不是应该产生两个临时...
  • 构造函数 ,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的...
  • 1.构造函数初始化 在构造函数中用初始化列表初始化数据域 Class Person(parameterList): dataField1(value1), dataField2(value2) { // Something to do } 2. 为何需要构造函数初始化列表 背景:类的.....
  • 在进入派生类(derived)的拷贝构造函数之前,就已经调用了基类(based)的构造函数, 无论你有没有显示的调用。 一般派生类是这种形式: derived(const derived & d):based(d) {} 为什么使用下列形式不行 ...
  • int lastnum = getNum(source.getProperty("fileName")); public static int getNum(String Filename) throws ... 第一行报错:缺省构造函数不能处理隐式超构造函数抛出的异常类型 IOException。必须定义显式构造函数
  • 构造函数与拷贝构造函数

    千次阅读 2019-04-03 09:07:15
    拷贝构造函数构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。 众所周知,构造函数是一个初始化类对象的函数...
  • C++的构造函数和默认构造函数详解

    万次阅读 多人点赞 2019-04-07 15:19:45
    C++的构造函数和默认构造函数 今天学习c++时突然感觉自己对构造函数和默认构造函数的区别有些分不清,于是查找了各大网站将资料汇总一下,供自己和其他朋友们参考。 构造函数是c++的类在构造对象时调用的函数,此...
  • C++拷贝构造函数构造函数和析构函数

    万次阅读 多人点赞 2018-08-30 22:09:15
    一、拷贝构造函数 转载自:http://www.cnblogs.com/BlueTzar/articles/1223313.html 1、类对象的拷贝  对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a;   而类对象与普通...
  • C++ 继承 构造函数、拷贝构造函数

    千次阅读 2013-12-18 17:50:59
    一、整体代码  01.cpp #include using namespace std; class ObjectB { public: ObjectB(int objb) : objb_(objb) { cout; } ~ObjectB() { cout~Obje
  • 1.默认构造函数:如果类中没有定义构造函数那么程序会默认的为类创建一个无参数构造函数用以对类进行实例化,如果有构造函数的话,那么程序就不会创建默认构造函数 2静态构造函数,不能访问实例成员,只能用来初始...

空空如也

1 2 3 4 5 ... 20
收藏数 198,046
精华内容 79,218
关键字:

构造函数