构造函数是初始化类对象的类成员函数。在c++中,当对象被创建时,自动调用构造函数,构造函数是该类的一个特殊成员的函数
构造函数和一般的成员函数有什么不同
a类中编译器自动生成的构造函数如下
a(){}
没有参数的构造函数,不论是编译器自动生成的还是自己写的,都称为默认构造函数。
如果写了构造函数,编译器就不会自动生成默认构造函数
#include <bits/stdc++.h> using namespace std; class a { public : int a, b; a() { a = 10, b = 20; } }; int main() { a tmp; printf("%d %d\n", tmp.a, tmp.b); a *p = new a; printf("%d %d\n", p->a, p->b); return 0; }
输出
10 20
10 20
可以将参数传递给构造函数,只需要向任意函数添加参数一样向构造函数里添加参数,用参数进行初始化。
#include <bits/stdc++.h> using namespace std; class a { public : int a, b; a(int x, int y) { a = x, b = y; } }; int main() { a tmp(10, 20); printf("%d %d\n", tmp.a, tmp.b); a *p = new a(30, 40); printf("%d %d\n", p->a, p->b); return 0; }
输出:
10 20
30 40
如果你的构造函数里有参数但你这么创建对象
a tmp; //报错 a *p = new a; //报错 a tmp(10); //可以,相当于tmp(10, 0);
报错是因为上面两条语句均没有涉及到构造函数的参数,因此编译器会认为这两个对象应该用默认构造函数初始化,但 a 类已经有了一个构造函数,编译器不会自动生成默认构造函数,于是 a 类不存在默认构造函数,所以上面两条语句就无法完成对象的初始化,导致编译报错。
在对象生成的时候,一定会自动调用一个构造函数对其初始化,对象一旦生成,就再也不会再这个对象上调用构造函数。
构造函数并不会为对象分配空间,再对象创建时内存空间已经被分配好,构造函数只负责初始化这段内存空间。
构造函数不但能隐性的调用,也可以显性的调用。
#include <bits/stdc++.h> using namespace std; class a { public : int a, b; a(int x, int y) {a = x, b = y;} }; int main() { a tmp = a(10, 20); printf("%d %d\n", tmp.a, tmp.b); return 0; }
看起来这没有什么用
构造函数是可以重载的,即写多个构造函数,它们具有不同的参数表和相同的名称,如果没有参数信息,编译器就认为调用默认构造函数。
特点
#include <bits/stdc++.h> using namespace std; class a { public : int a, b; a(int x, int y) { a = x, b = y; } a(int x) { a = x, b = 1; } a() { a = b = 0; } void mul() { printf("%d\n", a * b); } }; int main() { a a(10, 20); a b(20); a c = 10; //c=10可以视作c(10) a d; a.mul(), b.mul(), c.mul(), d.mul(); return 0; }
输出
200
20
10
0
如对本文有疑问, 点击进行留言回复!!
现在动物乐园有3个动物,袋鼠(花花、2岁、2条腿)、河马(憨憨、1岁、3条腿)、草泥马(草草、3岁、4条腿),分别使用面向对象学习前的知识和对象的知识完成对该数组的增删改查
网友评论