C++语法学习(14p)
3.重解释类型转换: reinterpret_cast
不同类型的指针或引用之间相互转换。
char* p = "1234000000zhangfei ";
struct Account{
char numb[4];
char passwd[6];
char name[10];
};
Account* pa = reinterpret_cast<Account*>(p);
也可以在任何类型的指针和整数之间进行转换。
4.常类型转换:const_cast
去除常指针或常引用的常属性(去常)。
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 const volatile int a = 10;//volatitle挥发性,编译器不再会优化;编译器会到内存中取值,禁止的常量优化 6 int* p = const_cast<int*>(&a); 7 *p = 20; 8 cout << a << endl;//cout << 10 << endl; 编译器优化了,直接蒋a做了字面替换 9 cout << *p << endl;//20 10 cout << p << ' ' << &a << endl;//地址一样 11 }
const修饰的变量不能做左值(不能放到赋值号的左边);
const 声明的变量不算是常量,应该叫右值变量;
三、C++之父给C程序员的建议
1.慎用宏,代之以const、enum、inline。
2.变量随用随声明同时初始化。
3.尽量用new/delete取代malloc/free。
4.少用void*,指针计算,联合和强制转换。
5.尽量使用string表示字符串,少用C风格的char*。
6.树立面向对象的编程思想。
四、面向对象编程(OOP)
BOP - 基于对象编程,使用现成的对象
OOP - 面向对象编程,使用现成的对象,还可以自己定义对象
1、什么是对象
万物皆对象。
2、编程思想
面向机器(汇编语言)
面向过程(C语言)——程序就是一系列的操作步骤
面向对象(C++,Java,C#,...)——程序就是一系列对象的交互,从对问题的描述入手编写程序。
抽象数据类型
手机:品牌、价格、外观、分辨率、处理器、内存
玩游戏、运行软件、播放媒体、打电话
对象:属性+行为
学生:姓名、年龄
学习、休息、娱乐
3、类和对象
类是对对象的抽象和描述,对象是类的具体化和实例化。
类的定义:
class 类名{
访问控制属性:
成员变量;
成员函数;
};
访问控制属性
public:公有,谁都可以访问该成员。
private:私有,只有自己可以访问该成员。
protected:保护,只有自己和自己的子类可以访问该成员。
4、构造函数
class 类名{
类名(构造形参表):初始化表{
构造函数体;
}
};
当对象被创建时,构造函数会被自动调用,以完成对对象的初始化和资源分配工作。
类名 对象名(构造实参表); //栈对象
new 类名(构造实参表); //堆对象
1)如果一个类没有定义构造函数,系统会提供一个无参构造函数(缺省构造函数),使成员变量获得定义,
对于基本类型的成员变量不初始化,对类类型的成员变量,用相应类型的无参构造函数初始化。
反之,如果定义了构造函数,无论有参无参,系统都不会再提供无参构造函数了。
无参构造函数并非真的无参,可以以无参的方式去调用。(构造形参都是缺省参数)
2)构造函数重载:注意不要和缺省参数构成歧义。
3)初始化表:指示成员变量的初始化方式。
A.如果有类类型成员变量,而该类型又没有无参构造函数,则必须通过初始化表初始化该成员变量。
B.需要在子类中指定其基类部分的初始化方式,必须使用初始化表。
C.成员变量初始化顺序由声明顺序决定,而与初始化表的顺序无关。
(先声明的地址低,创建内存从低地址开始,一块一块往上增长。)低地址往高地址创建。
class Dumy{
public:
Dumy(char* p):m_str(p),m_len(m_str.length()){}//ERROR
Dumy(char* p):m_str(p),m_len( strlen(p) ){}//OK
private:
int m_len;
string m_str;
};
构造构成:构造基类部分 -> 定义(并初始化)成员变量 -> 构造函数体中的代码
(保证当执行到函数体的时候,所有需要的资源(成员变量)都已经有了)
5.分开声明和定义类
类的声明部分放在.h中
类的实现部分放在.cpp中
使用该类的代码可能还会在其它.cpp中
浙公网安备 33010602011771号