C++基础整理 —— 类 Class(5.2)——构造函数

1. 成员的种类

 

class 类名称{
	private: 
             私有成员;      // 只能被成员函数所引用(不能被对象引用)。默认情况下都是私有的(缺省设置)。
	protected:
             保护成员;      // 除了可被成员函数所引用外,还可被派生类引用。(半封闭性)
	public:
             公有成员;      // 可以被任何成员引用.
};

注:

  • 成员数据:大部分都会列为私有成员,因为类数据必须有封装的效果,使数据具有一致性不可以随便让成员函数以外的函数来引用;
  • 成员函数:大部分都会定义为公有成员,因为这是类以外的函数可以操作该对象的公共接口。
  • 类中的数据成员的数据类型可以是任意的,但不允许对所定义的数据成员进行初始化。

 

class person{
    private: 
        int age=18;         // 错误
}

2. 构造函数(Constructor)

  • 定义:类的定义中不能对数据成员进行初始化,为了给数据成员自动设置某些初始值,就要使用类的特殊成员函数-------构造函数。
  • 特点:
    • 与类同名;不具有返回类型;
    • 公有函数,但它不能象其他成员函数被显示地调用,构造函数可以被重载。
    • 定义对象时,编译系统会自动调用构造函数;
  • 利用构造函数,创建对象的方法:

a. 直接初始化;

Ccomplex A(1.2,3.4);
 cout<<A.abscomplex();

b. 通过指针和new来实现;

Ccomplex *A=new Ccomplex(1.2,3.4);
cout<<A->abscomplex();
  • 说明:
    • 如果没有给类定义构造函数,则编译系统自动地生成一个默认的构造函数。例如:Ccomplex :: Ccomplex(){};
    • 构造函数可采用初始化表对数据进行初始化;
    • 对没有定义构造函数的类,其公有数据成员可以用初始表进行初始化;
    • 初始化数据不一定只能用构造函数;
class Ccomplex{
public:
char name[10];
double imag;
};
void main(int argc, char* argv[])
{
 Ccomplex A={"wang",21};
 cout<<A.name ;
}

 

  • 重载构造函数!!!!
  • 代码

 

#include <iostream>
using namespace std;

// 类
class family{
    private:
        int age1;
        int age2;
        double weight1;
        double weight2;
    public:
        family(int x,int y)   // 析构函数:公有函数;与类同名;不具有返回类型;
        {age1=x;age2=y;}
        // 等价于:family(int x, int y):age1(x);age2(y){}
        family(double m,double n)
        {weight1=m;weight2=n;}
        int sum();
};

// 函数成员
int family::sum()
{return age1+age2;}           // 外部:显示定义

int main()
{
    // 用法一,构造函数创建对象:方法一,直接初始化
    family A(10,20);          // 定义对象时,调用构造函数
    cout << A.sum() << endl;  // 30
    // 用法一,构造函数创建对象:方法二,通过指针和new来实现
    family *B=new family(35,55);
    cout << B->sum() << endl;
    // 构造函数的重载
    family C(10.0,20.0);

    return 0;
}

3. 拷贝构造函数(copy constructor)

  • 定义:
    • 拷贝构造函数是一种特殊的构造函数.它用于依据已存在的对象,建立一个新的对象;
  • 特点:
    • 因为该函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回类型;
    • 该函数只有一个参数,并且是同类对象的引用;
    • 每个类都必须有一个构造函数.如果程序员没有定义类的拷贝构造函数,系统就会自动生成一个默认的拷贝构造函数,用于复制出数据成员值完全相同的新对象;
    • 同类型的对象之间也可以进行赋值;
  • 自定义拷贝函数:
    • 在程序中,用一个对象去初始化另一个对象,或者说,用一个对象去复制另一个对象,可以有选择、有变化的复制。
    • 方法:
      • “代入”法:point p2(p1);
      • “赋值”法:point p2=p1;
  • 综合代码:
#include <iostream>
using namespace std;

// 功能:拷贝构造函数;

class person{
    int x,y;
public:
    person(int a,int b)
    {x=a;y=b;}
    person(const person &p)
    {x=2*p.x;y=2*p.y;}
    void print()
    {cout << "x:" << x << " y:" << y <<endl;}
};

int main(int argc,char* argv[])
{
    person A1(10,20);
    A1.print();//10,20;
    person A2(A1);          // 用法一,调用自定义拷贝,方法一:“代入”法;
    A2.print();//20,40;
    person A3=A1;           // 用法一,调用自定义拷贝,方法二:“赋值”法;
    A3.print();//20,40;
    // 用法二,同类型的对象之间可以赋值;
    person B1(30,40);
    person B2(50,60);
    B2=B1;
    B2.print();//30.40;
    return 0;
}

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值