//默认构造函数
//隐世类型转换
//类成员的显示初始化
//构造函数 //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; }