天天看点

c++学习--类与对象--构造函数

特点:1.定义和声明不写返回值,函数名与类名称相同。

          2.在创建对象的时候自动调用构造函数来为完成对象的初始化工作。

          3.构造函数可以有多个参数,即部分成员变量传参赋值。

          4.构造函数可以重载,即可以有多个构造函数(函数名相同,参数个数和类型不同)

          5.初始化顺序按照成员变量的声明顺序 与构造函数赋值顺序无关。

          6.如果自定义了构造函数,编译器默认使用自定义构造函数来初始化。

          7.通过malloc分配的对象不会生成构造函数,但通过new分配的对象会生成构造函数。

             如何理解--malloc是从C语言继承过来的语法,C语言没有对象概念,则也不会调用构造函数

         8.如何理解默认情况下,编译器会为类生成一个空的无参构造函数?

              不完全正确,与虚函数有关,见后文验证

         9.注意区分无参构造函数和返回值为类的函数。

         10.如果自定义了构造函数,除了全局区,其他区域都得自己手动初始化成员变量。

Person person0;     // 调用无参构造函数
  Person person1();    // 函数声明
  Person person2(20);   // 调用有参构造函数
           

 构造函数的基本使用

class Person {
public:
	int m_age;
	int m_height;
	Person() {              //无参数构造函数
		m_age = 0;
		m_height = 0;
			cout << "Person()" << endl;
	}

	Person(int age, int height) {      //有参构造函数 函数重载
		m_age = age;
		m_height = height;
			cout << "Person(int age)" << endl;
	}
	void display(){
		cout << "m_age is" << m_age << endl;
		cout << "m_height is" << m_height << endl;

	}

private:
};
int main() {

	Person person0; // Person()
	person0.display();
	Person person2(20, 20); // Person(int)
	person2.display();
	return 0;
}

           

代码结果

c++学习--类与对象--构造函数

 验证默认情况下,编译器会为类生成一个空的无参构造函数

情况一、没有在类中对成员变量赋初值,则不会调用构造函数。

class Person {
public:
	int m_age;
	int m_height;

private:
};
int main() {
	Person a;    //从汇编中可以看出 没有调用call构造函数的指令
	a.m_age = 10;  
	/*Person a;
	a.m_age = 10;
	00E6404E C7 45 F4 0A 00 00 00 mov         dword ptr[a], 0Ah*/
	return 0;
}
           

情况二、在类中对成员变量赋初值,则会调用构造函数。

class Person {
public:
	int m_age=5;
	int m_height;
private:
};
int main() {
	Person a;    //从汇编中可以看出 调用call构造函数的指令
	//Person a;   
	//007837B8 8D 4D F0             lea         ecx, [a]
	//	007837BB E8 54 DD FF FF       call        Person::Person(0781514h)
       //	a.m_age = 10;
	//007837C0 C7 45 F0 0A 00 00 00 mov         dword ptr[a], 0Ah


	a.m_age = 10;  
	
	return 0;
}

           

验证:自定义了构造函数,除了全局区,其他区域都得自己手动初始化成员变量。

//使用默认构造函数
class Person {
public:
	int m_age;
	int m_height;


private:
};

Person a;         //位于全局区
int main() {

 //       栈区   结果 运行报错,未初始化
//        Person b;     //在main函数中,故位于栈区
         Person *c = new Person;   //位于堆区
	Person *d = new Person();  //位于堆区

	cout << a.m_age << endl;
//	cout << b.m_age << endl;
	cout << c->m_age << endl;
	cout << d->m_age << endl;
	delete c;
	delete d;
	
	return 0;
}
运行结果:
           
//使用自定义的空构造函数
class Person {
public:
	int m_age;
	int m_height;
	Person(){                     //自定义空构造函数

	}

private:
};

Person a;         //位于全局区  成员初始化为0   全局变量默认值都为0
int g_age;      //初始值默认为0

int main() {
//	Person b;     //在main函数中,故位于栈区  结果 运行报错,未初始化

	Person *c = new Person;    //位于堆区   没有初始化成员

	Person *d = new Person();  //位于堆区    没有初始化成员
	
cout <<"全局区a.m_age的值:"<< a.m_age << endl;
//cout <<"栈区 b.m_age的值:"<< << b.m_age << endl;
cout << "new Person   堆区c.m_age的值:" << c->m_age << endl;
cout << "new Person() 堆区d.m_age的值:" << d->m_age << endl;

delete c;
delete d;

return 0;
}
           

参考:30小时快速精通C++编程和外挂实战课程  07-03构造函数(1)

继续阅读