C++学习日记day02

来源:互联网 发布:林仕鼎 知乎 编辑:程序博客网 时间:2024/06/08 02:22

第二课
1. 引用与函数
1) 引用型参数
通过引用型参数可以提高参数传递的效率,但是会带来风险,可能会在函数中意外地修改实参

的值,为此可以采用const型引用,避免发生这样的错误。
2) 引用型返回值
任何时候都不要返回局部变量(包括函数参数)的引用。
可以返回:
全局变量、静态变量、动态分配变量、成员变量、实参引用
2. 类型转换
int n;
char c = (int)n;
char c = int (n);
1) 静态类型转换:static_cast<目标类型> (源类型标识符)
转换时做静态类型检查。
在源类型和目标类型之间一个方向上可以做隐式转换,则在两个方向上都可以做静态转换。
char* pc;
void* pv = pc;
pc = static_cast<char*> (pv);
2) 动态类型转换:dynamic_cast<目标类型> (源类型标识符)
应用具有多态关系的父子类之间。
3) 重解释类型转换:reinterpret_cast<目标类型> (源类型标识符)
用在不同类型的指针之间做任意的转换。
int n;
char* p = reinterpret_cast<char*> (&n);
p[0]
p[1]
p[2]
p[3]
10账号
8密码
20户名
struct Tel {
    char acc[18];
    char pwd[8];
    char name[20];
};
char* p;
Tel* pTel = reinterpret_cast<Tel*> (p);
pTel -> acc
pTel -> pwd
pTel -> name
4) 常量类型转换:const_cast<目标类型> (源类型标识符)
修改CV属性。
const int* cp = ...;
int* p = const_cast<int*> (cp);
const int& cr = ...;
int& r = const_cast<int&> (cr);
const int n = 10;
int* p = const_cast<int*> (&n);
*p = 20;
n -> 20 ?
3. C++之父给C程序员的建议
1) 在C++中几乎不使用宏,用const、enum、inline、template替代之。
2) 变量随用随声明同时初始化。
int size = 0;
// 获取文件大小
int size = ftell (fp);
char* buf = new char[size];
3) 不用malloc()/free()而改用new/delete。
4) 避免使用void*、指针算术、联合、强制类型转换。
5) 字符串尽量避免使用C风格的字符串,而使用string类型。
直接赋值:string s = "hello";
          string s ("hello");
直接复制:s1 = s2;
直接拼接:s1 += s2;
6) 更加重要的是思想:OOP。C++/++C。
4. 面向对象编程
1) 什么是对象:对象就是个东西。属性和行为。
2) 什么是面向对象:以属性和行为的观点分析现实世界的事物——大处着眼。
3) 什么是面向对象编程:用面向对象的方法编程。
4) 为什么要面向对象编程:软件产业化发展的需求。
5) 怎样做到面向对象编程:面向对象的思想精髓(封装、继承、多态),至少掌握一种编程语

言C++/Java/C#,元语言UML,设计模式。
5. 类和对象
学生
  属性:姓名、年龄、性别、学号
  行为:学习、娱乐
教师
  属性:姓名、年龄、性别、职称
  行为:教学、娱乐
1) 类的定义
class 类名 {
};
如:
class Student {
};
2) 成员变量
class 类名 {
    类型 成员变量名;
};
如:
class Student {
    string m_strName;
    int m_nAge;
};
3) 成员函数
class 类名 {
    返回类型 成员函数名 (形参表) {
        成员函数体;
    }
};
如:
class Student {
    void Learn (string strLesson) {
        ...
    }
    string m_strName;
    int m_nAge;
};
声明和实现分开:
class Student {
    void Learn (string strLesson);
    string m_strName;
    int m_nAge;
};
void Student::Learn (string strLesson) {
    // ...
}
4) 访问控制
A. public:公共成员,谁都可以访问;
B. private:私有成员,只能自己访问;
C. protected:保护成员,只能自己和子类访问。
如:
class Student {
public:
    void Learn (string strLesson) {
        cout << m_strName;
    }
private:
    string m_strName;
    int m_nAge;
};
访控限定符 访控属性 自己 子类 其它
public     公共成员  OK   OK   OK
protected  保护成员  OK   OK   NO
private    私有成员  OK   NO   NO
注意:类的缺省访控属性是private,而结构的缺省访控属性是public。
5) 构造函数
class 类名 {
    类名 (形参表) {
        构造函数体;
    }
};
当对象被创建的时候构造函数自动被调用。可以对对象的成员变量做初始化。
如:
class Student {
    Student (string strName, int nAge) {
        m_strName = strName;
        m_nAge = nAge;
    }
};
Student student ("张飞", 25);
如果没有为一个类提供任何构造函数,系统就会提供一个无参构造函数(缺省构造函数、默认

构造函数)。如果为该类提供了至少一个构造函数,无论其有参无参,系统都不会再提供任何

形式的构造函数。
无参构造函数未必真的没有参数,而是可以以无参的方式被调用。
6) 初始化表
class 类名 {
    类名 (形参表) : 成员变量 (初始值), ... {
        构造函数体;
    }
};
class Dumy {
public:
    Dumy (string str) : m_str (str), m_len (str.length ())
    {
    }
private:
    int m_len;
    string m_str;
};
int n = 10;
Dumy d (...);
练习:
定义一个类Girl
属性:姓名、年龄、是否有BF。
提供一个无参构造函数和一个有参构造函数,以及用于显示全部属性的成员函数。
练习:
time_t t = time (NULL);
struct tm* pt = localtime (t);
sleep (1);
定义一个类Clock
属性:时、分、秒
无参构造函数,用当前的系统时间初始化时分秒属性。
成员函数Run(),打印16:33:12,每秒更新一次
Clock clock;
clock.Run ();