huangfu Blog
Love Leanote!
Toggle navigation
huangfu Blog
主页
About Me
归档
标签
04构造函数\初始化列表\类头文件于源文件分离
2017-02-06 19:59:32
246
0
0
tarena
# 构造函数 **1. 概念** 和类名相同的一个特殊函数,并且没有返回值类型. 构建对象时会自动调用一次 `目的是为了完成对象的初始化工作` **2. 例子代码** #include <iostream> #include <string> using namespace std; class Car { public: /* 特征*/ string cno; string color; double price; double speed; /* 构造函数 构造函数的权限必须为public*/ Car() { cno = "京A.9520"; color = "红色"; price = 888888.8; speed = 200; cout << "初始化完成" << endl; } /* 行为*/ void show() { cout << "车牌:" << cno << "颜色:" << color << "价格:" << price << "最高速度:" << speed << "Km/h" << endl; } void start() { // ... } void run(double s) { cout << "以速度" << s << "Km/h 运行" << endl; } void stop() { // ... } }; int main() { Car car; Car *car2 = new Car(); car.show(); car.start(); car.run(100.21); car.stop(); /* 如果构造函数有参数*/ //Car car5(123); /* 如果构造函数没有参数,就不要写圆括号,否则编译器会理解成函数声明*/ } **3. 一个对象被创建的过程** 1. 根据内存大小分配内存空间 2. 处理成员变量 如果成员变量是基本类型,则使用内存中的值 如果成员变量是类类型,则创建它 3. 调用构造函数 例子代码 #include <iostream> using namespace std; class Date { int year; int mon; int day; public: Date() { year =2000; mon = 1; day = 1; cout << "Date()" << endl; } void show() { cout << year << '-' << mon << '-' << day << endl; } }; class User { int age; public: Date date; User() { age = 18; cout << "User()" << endl; } void show() { cout << "年龄是: " << age << endl; } }; int main() { User user; // 顺序输出 Date() User() user.show(); // 输出2000-1-1 user.date.show(); // 输出 年龄是: 18 } **4. 构造函数的应用** * 构造函数可以有多个 并且可以形成重载关系 `如果提供了一个构造函数,则系统默认的无参数构造会回收` 构造对象时会根据参数的传入情况调用相应的构造函数 通常我们可以使用参数的默认值来简化构造函数的个数 例子代码 #include <iostream> using namespace std; class A { int x; int y; public: A(int px) { cout << "A()" << endl; } A(int px, int py) { cout << "A()" << endl; } }; int main() { A a; // 编译报错 /* 因为上面提供了一个带参的构造函数,所以系统默认的构造函数被收回,因此上面没有传实参的创建对象编译过不去*/ } * 如果构造函数的参数上有默认值,在构造函数声明和实现分离时,应该在声明中指定. * 如果对象的成员类型有`const类型成员或引用类型成员`时,需要在构造函数的**初始化列表**中指定相应的值. 例子代码 #include <iostream> using namespace std; class A { const int x; public: A() { x = 1; } }; int main() { A a; // 编译报错,说x没有进行初始化 } #初始化列表 初始化列表用于const类型成员或引用类型成员的初始化问题 `因为这些类型的数据需在在调用构造函数之前进行初始化` **1. 概念** 构造函数的参数列表之后,函数体之前以冒号开头的一块语句 **2.例子代码-const** #include <iostream> using namespace std; class A { const int x; public: A():x(100) // 初始化列表 { } A(int px ):x(px) // 初始化列表 { } }; int main() { /* 如果没有初始化列表, 则编译过不去*/ A a; A a(200); } **2.例子代码-引用** #include <iostream> using namespace std; class A { int& x; int z; public: A(int px, int z):x(*(new int(px))), z(z) // 初始化列表 { } }; int main() { A a(200,100); } /* 初始化列表可以自动判别成员变量和参数,所以如上一例所示,成员变量可以于参数重名*/ /* 初始化列表也可以解决普通成员变量的初始化*/ #类的头文件和实现文件分离 **1. 头文件** 条件编译 导入其他头文件 声明函数 定义函数 定义类型 data.h: #ifndef __DATE_H__ #define __DATE_H__ extern int g_x; void show(); class Date { private: int year; int mon; int day; public: Date(int year = 1970, mon = 1, day = 1); void show(); void setDate(int y = 1900, int m = 1, int d = 1); }; #endif **2. 源文件** 函数的实现 类型的实现 data.cpp: #include "data.h" #include <iostream> using namespace std; void show() { cout << "这是全局函数show" << endl; cout << "访问全局变量:" << g_x << endl; } Date::Date(int year, int mon, int day) :year(year),mon(mon),day(day) { } void Date::show() { cout << year << '-' << mon << '-' << day << endl; } void Date::setDate(int y, int m, int d) { year = y; mon = m; day = d; } #练习 * 写一个时间类Mytime * 三个成员变量 时分秒 * 提供构造,并有三个参数,默认值000 * 提供私有的显示事件函数 * 提供私有dida走一秒函数 * 提供一个公开run函数,要求不断更新时间 * 要求头文件实现文件分离
上一篇:
03类型转换运算符/类和对象
下一篇: 无
0
赞
246 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册