一 、 c++ 给c程序员的建议
1.1 尽量的少使用宏
多使用 枚举 const inline
1.2 变量随时用随时定义
保证这些变量可以及时的初始化
1.3 动态内存分配时
使用new delete 少使用malloc free
1.4 少使用c风格的字符串 多使用string
1.5 少使用强制类型转化
如果需要进行类型转换 就使用转换运算符
1.6 使用面向对象的思想去进行编程
二、面向对象编程
2.1什么是对象
一切皆对象
任何对象 都是一个类型
同类型的对象 可接收相同的消息
对象就是现实中的物体 在计算机中的变量
2.2 类 ----------分类
2.3 分类如何实现
抽取一组对象的共同特征:
car
颜色
价格
牌子
抽取行为:
void run();
void start();
void stop();
2.4 计算机中如何表达一个类型?
使用结构体描述一个类型
特征:成员变量
行为:成员函数
Student
特征:
string name;
int age;
string sno;
行为:
void play(string name);
void learn(string name);
#include <iostream>
using namespace std;
struct Student{
/*特征*/
string name;
int age;
string sno;
bool gender;
double height;
double weight;
/*行为*/
void play(string name){
cout < < "play" << name << endl;
}
void learn(string name){
cout << "learn" << name << endl;
}
void show(){
cout << "my name is " << name
<< "age is" << age << endl;
}
};
int main(){
Student sa={"xxx", 30 };
sa.play("qwer");
sa.learn("c++");
sa.show();
}
2.5设计一个时间 使用struct描述
特征:
int hour;
int min;
int sec;
行为:
/*显示时间*/
void show();
/*调用一次代表走一秒*/
void dida();
/*不断的走秒*/
void run();
#include <iostream>
#include <iomanip>
using namespace std;
struct MyTime{
int hour;
int min;
int sec;
void show(){
cout << setfill('0') << setw(2)
<< hour << ':' << setw(2)
<< min << ':' << setw(2)
<< sec << '
' << flush;
}
void dida(){
sleep(1);
if(60 == ++ sec){
sec=0;
if(60 == ++min){
min=0;
if(24 == ++hour){
hour=0;
}
}
}
}
void run(){
while(1){
show();
dida();
}
}
};
int main(){
MyTime mytime={11,37,27};
mytime.run();
}
2.6 class 来描述一个类型
struct -----> class
初始化问题 -----> 构造函数
权限问题 -----> class中的数据默认是私有的 struct默认是公开的
私有的
private: 只能在类内访问成员
public: 既能类内 也能在类外
protected: 类内和子类中可以访问
#include <iostream>
using namespace std;
class MyTime{
private:
int hour;
int min;
int sec;
public:
/*为访问私有数据 公开访问接口*/
void setTime(int h=0,int m=0,int s=0){
hour= h;
min = m;
sec=s;
}
void dida(){
sleep(1);
if(60 == ++ sec){
sec=0;
if(60 == ++min){
min=0;
if(24 == ++hour){
hour=0;
}
}
}
}
void run(){
while(1){
show();
dida();
}
}
}
int main(){
MyTime mytime;
/*使用公开的接口 给成员变量赋值*/
mytime.setTime(11,17,37);
mytime,run();
}
2.7使用类描述一个日期 Date
特征:
int year;
int month;
int day;
行为:
设置日期;
显示日期;
#include <iostream>
using namespace std;
class Date{
public :
void setDate(int y=2014,int m=12,int d=12){
year=y;
month=m;
day=d;
}
void show(){
cout << setfill('0') << setw(4)
<< year << '-' << setw(2)
<< month << '-' << setw(2)
<< day << endl;
}
private:
int year;
int mon;
int day;
};
int main(){
Date date;
date.setDate(2012,12,12);
}
三、构造函数
1.1 特点
构建一个对象时 自动调用一次
没有返回值类型
函数名 和 类名相同
目的是为了初始化对象
#include <iostream>
using namespace std;
class Date{
private:
int year;
int month;
int day;
public:
Date(){
cout << "Date()" << endl;
year=2014;
month=1;
day=1;
}
void show(){
cout << setfill('0') << setw(4)
<< year << '-' << setw(2)
<< month << '-' << setw(2)
<< day << endl;
}
};
int main(){
/*类型的实例化*/
Date date;
Date *pd = new Date();
Date *pd1 = new Date;
/*编译器会翻译成函数声明*/
Date date2();
date.show();
}
1.2 一个对象创建的过程
根据类型大小 分配内存
初始化成员变量
基本类型的成员 什么都不做
类类型的成员 就构造这个成员
调用这个了类型对应的构造函数
1.3 构造函数的应用
构造函数 可以有参数 构造函数之间可以形成重载关系。(系统会默认提供一个无参构造函数 但一旦提供构造函数则系统的会自动回收掉)
可以是引用参数的默认值 减少构造函数的个数。但不要引入冲突。
当类型中有const 类型的成员 和引用 类型成员时。这些成员要求在构造函数调用之前就初始化。初始化参数列表时唯一的选择
初始化参数列表 只有构造函数有,构造函数参数表之后 实现体之前。
#include <iostream>
using namespace std;
class A(){
const int x; //const 类型的成员
int y;
int& z; //引用类型成员
public:
/* A():x(100),y(123){
}*/
A(int& z, int x=100,int y=123):z(z),x(x),y(y){//初始化参数列表可以区分谁是参数,谁是成员变量x(x) 第一个为成员变量,第二个为参数
}
void show(){
cout << x << '/' << y << '/' << z << endl;
}
};
int main(){
int p=1;
A a(p);
a.show();
}
四、在实际开发中头文件和实现文件要分离
4.1先写头文件
#ifndef 宏
#define 宏
变量的声明
函数的声明
类型的定义
#endif
4.2 实现文件
实现全局函数
实现类型
去掉类型名 和 成员变量 权限
在每个函数名前加上 类名::
实现函数
4.3 写测试文件
使用类型定义对象
写一个带参宏,完成两个整数取最大值的逻辑
GETMAX(100,200)