c++构造函数初探

C++构造函数初探



        C++构造函数的功能是在创建对象时,用给定的值对对象进行初始化。构造函数是成员函数,他有成员函数的共性,他是特使的成员函数,拥有自己的特性:该函数名与类名相同,不指定返回值类型,他有隐含的返回值,该值由系统内部使用。

一、构造函数形式

class Person
{
public:
         Person(){
........   
........
         }         
private:      
         int nage;
}

二、构造函数分类

1、系统默认

class Person
{
public:    
private:      
         int nage;
}

        在类中没有自己定义构造函数的时候,系统会默认调用一个无参构造函数,这个构造函数是一个空函数,相当于:

Person(){
}

2、无参构造函数

class Person
{
public:
         Person(){
nage = 10;   
........
         }         
private:      
        int nage;
........
}

        无参构造函数会在创建对象时,用指定的值对对象的成员变量进行初始化,因为没有参数传入,所以初始化值是在程序设计时就已经确定的,在对象创建时无法改变,灵活性比较差。

3、带参数的构造函数---又称为 重载构造函数

class Person
{
public:
         Person( int  x,........){
nage = x;   
........
          }         
private:      
        int nage;
........
}

        重载构造函数同样是在对象创建时,用传入的指定参数对成员变量进行初始化,这种初始化的方式比较灵活。构造函数可以像普通成员函数一样重载,显而易见构造函数不会局限于一个,当对象在创建时,会根据传入参数的类型,数量,顺序调用匹配的构造函数,对对象成员变量进行初始化。

4、复制构造函数

class Person
{
public:
         Person(Person &x){
this->strname = x.nage;
this->nage = x.nage;
........
         }         
private:      
        int nage;
........
}

复制构造函数是用一个已知的对象来创建一个新对象,新对象和已知对象数据成员的值可以相同,也可以不同的。在没有定义复制构造函数时,系统同样会为类提供一个默认的构造函数,在这种情况下,两个对象的数据成员值完全一样。

复制构造函数在以下三种情况中必须被调用:

a)、明确表示由一个对象来初始化另外一个对象;//Person  per2(per1);

b)、当对象作为函数实参传递给函数形参的时候;  //fun(per);

c)、当一个自动存储类对象作为函数返回值的时候;//return per;


        示例:

#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
string strname;
int nage;
//构造函数
//无参数构造函数
Person(){
} 
//有参构造函数 
Person(string name){
strname = name;
}
Person(string name,int age){
strname = name;
nage = age;
}
//复制构造函数
Person(Person &x){
this->strname = x.strname;
this->nage = x.nage;
}
}
void main(){
Person per;//调用无参构造函数
Person per1("xiaozhang",10);//调用有参构造函数
Person per2(per1);//调用复制构造函数
Person per3 = per2;//调用复制构造函数
}

三、子类显示调用父类构造方法

         示例:

#include <string>
#include <iostream>
using namespace std;
class Person{
public:
string strname;
int nage;
Person(string name, int age):strname(name),nage(age){
// this->strname = name;
// this->nage = age;
}
};
class Student : public Person{
public:
int  nnum;
Student(string name, int age,int num):nnum(num),Person(name,age){
// this->nnum = num;
}
};
void main(){
Student stu("xiaozhang",19,22);
}

        在子类初始化中有两种形式,一种是在子类中直接对每个数据成员赋值(包括继承父类的数据成员),另一种方法是通过在子类的构造方法后面加:父类名(参数表)来调用父类构造方法,从而对子类对象进行初始化。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值