C++面向对象程序设计——构造函数

//默认构造函数

//隐世类型转换

//类成员的显示初始化

//构造函数
//const常量、引用类型、没有默认构造函数的类类型都必须在初始化列表中定义
#include <iostream>

using namespace std;

class Person{
public:
    Person():age(0) {}
    Person(const std::string &nm, int a): name(nm), age(a) {}
    //如果类没有构造函数,C++会自动创建构造函数,一般要求必须写上构造函数

public :
    std::string name;
    int age = 0;
};

class Cat{

public:
    Cat():age(0){} //默认构造函数
    Cat(std::string &nm) : name(nm), age(0) {} //有参数的构造函数
    std::string getName() {return this->name;}
    int getAge() { return this->age;}
private:
    std::string name;
    int age;
};

class Dog{
public:
    Dog():legs(4) {}  //初始化列表进行赋值
    //Dog(){this->legs = 4; }  //legs是const常量,必须在初始化列表中定义,另外,引用类型也必须用初始化列表进行初始化,没有默认构造函数的类类型
private:
    std::string name;
    const int legs ;

};


class Sales_item{
public: //为了避免构造函数的副作用,要在每个构造函数前面写上explicit
    //只有一个形参的构造函数会产生副作用,都写上explicit并不多余
    explicit Sales_item (const std::string &book, int units, double price) //用初始化列表的方式创建构造函数
        :isbn(book), units_sold(units), revenue(units * price)
        {}  //此处初始化的顺序可以随便写,初始化的顺序是由定义时的次序决定的
    explicit Sales_item(const std::string &book ): isbn(book),units_sold(0), revenue(0.0) {} //构造函数,定义一个默认的实参""
    explicit Sales_item(std::istream &is) { is >> *this;} //输入流 重载构造函数
    explicit Sales_item(int units, double price) {  //构造函数永远不需要变成const,
        //利用赋值初始化,此写法速度比较慢
        this->units_sold = units;
        this->revenue = units * price;
    }

    explicit Sales_item():isbn(10,'A'),units_sold(0), revenue(0.0){} //构造函数与类名相同,没有返回值,可以定义多个构造函数
    //此时只对两个元素进行初始化,C++还是会对另一个元素利用默认构造函数进行初始化
    //isbn初始化为10个A

    bool same_isbn(const Sales_item &rhs) const{
        return isbn == rhs.isbn;
    }

    friend std::istream& operator>>(std::istream&, Sales_item&); //利用友元函数做了一个有输入操作符的重载
private:  //初始化的顺序由下面的先后次序决定
    std::string isbn; //书的编号
    unsigned units_sold; //销售数量
    double revenue; //销售金额
};

inline istream& operator>>(istream& in, Sales_item& s){
    double price;
    in >> s.isbn >> s.units_sold >> price;
    if(in)
        s.revenue = s.units_sold * price;
    else
        s = Sales_item(); //没有收入,创建空对象
}

//写出class默认是private,写成struct默认为public
class Data{
public:
    int ival;
    char *ptr;
};

class Eata{
public:
    Eata(int i, char *p):ival(i), ptr(p){} //构造函数
private:
    int ival;
    char *ptr;
};

int main(){
    Data v = {9, "hello"}; //传统c语言的做法, 前提是数据成员都是public,不可以有构造函数
    Eata w(9, "hello"); //C++写法
    const int k = 10;
    Cat acat; //此处调用的是默认的构造函数

    Person a("张飞", 22);

    Person b; //调用默认构造函数
    cout << a.name << endl;
    cout << a.age << endl;

    Sales_item item1;
    Sales_item item2("0-201-82470-1");
    Sales_item *p = new Sales_item(); //利用指针创建对象,调用构造函数
    delete p;
    const Sales_item item3;

    Sales_item myobj;
    if(myobj.same_isbn(item2)){
        cout << "相同" << endl;
    }


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值