C++核心编程
内存分区模型
c++程序在执行时,将内存大方向划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
意义:
不同区域存放的数据,赋予不同的生命周期,给我们强大的灵活编程
程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
存放cpu执行的机器指令
代码区是共享且只读的
全局区:
全局变量和静态变量存放至此
全局区还包含了常量区,字符串常量和其他常量也存放至此
该区域的数据在程序结束后由操作系统释放
类和对象
C++面向对象的三大特征:封继承、多态
C++认为万事万物皆为对象,对象有其属性和行为
封装
语法:class类名{访问权限:属性 / 行为}
示例一:设计一个园类求圆的周长
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <iostream> using namespace std; const double PI = 3.14; class circle { public: int m_r; double calculateZC() { return 2*PI*m_r; } }; int main() { circle c1; c1.m_r=10; cout<<"圆的周长为:"<<c1.calculateZC()<<endl; return 0; }
|
示例二:设计一个学生类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <iostream> #include <string> using namespace std; class student { public: string m_Name; int m_ID; void showstudent { cout<<"姓名:"<<m_name<<"学号:"<<m_ID<<endl } viod setname(string name) { m_name=name; } }; int main() { student s1; s1,m_name="张三"; s1.m_ID = 1; s1.showstudent(); student s2; s2.m_name ="李四"; s2.m_ID=2; s2.showstudent(); s3.setname("王五"); s.m_ID=; s3.showstudent(); return 0; }
|
访问权限:
1.public 公共权限 类内可以访问 类外可以访问
2.protected 保护权限 类内可以访问 类外不可以访问 儿子可以访问父亲中的保护内容
3.privet 私有权限 类内可以访问 类外不可以访问 儿子不可以访问父亲的私有内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <iostream> #include <string> using namespace std; class person { public: string m_name; protected: string car; private: int m_password; private: void func() { m_name = "张三"; m_car = "拖拉机"; m_password = 123456; }
}; int main() { person p1; p1.m_name = "李四"; return 0; }
|
struct和class的区别
c++中二者默认的访问权限不同
- struct 的默认权限是 public
- class 的默认权限是 private
成员属性设置为私有
优点:
1.将所有成员属性设置为私有,可以控制读写权限
2.对于写权限,我们可以检验数据的有效性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include <iostream> #include <string> using namespace std; class person { public: void setname(string name) { m_name = name; } string getname() { return m_name; } string getage() { m_age = 0; return m_age; } string getage() { return m_age; } void set_age(int age) { if(age<0||age>150) { cout <<"输入有误" <<endl; return; } m_age = age; } viod setlover(string lover) { m_lover = lover; } private: string m_name; int m_age; string lover; }; int main() { person p; p.m_name = "张三"; p.setname("张三"); cout<<"姓名为:"<< p.getname() << endl; p.m_age =18; p.setage(18); cout<<"年龄为:"<< p.getage() << endl; p.setlover("李四"); cout<<"情人为:"<< p.m_lover << endl; cout<<"情人为:"<< p.getlover() << endl; p.set_age(1000); p.set_age(18); return 0; }
|
对象的初始化和清理
每个对象的初始设置以及对象销毁前的清理数据的设置
构造函数和析构函数
对象的初始化和清理也是两个非常重要的安全问题
c++利用以上两者解决上述问题,并且会被编译器自动调用,完成上述的工作
但是编译器提供的构造函数和析构函数是空实现
- 构造函数:创造对象时为其成员属性赋值
- 析构函数:令对象进行销毁,执行一些清理工作
构造函数语法:类名(){}
1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象的时候会自动调用构造,无需手动调用,并且只会调用一次
析构函数语法:~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上~
3.析构函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无需手动调用,并且只会调用一次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <iostream> #include <string> using namespace std;
class person { public: person() { cout <<"person 构造函数的调用"<<endl; } ~person() { cout<<"Person的析构函数调用"<<endl; } } viod tset01() { person p; } int main() { test01(); person p; system("pause"); return 0; }
|
构造函数的分类及调用
两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三中调用方式:
括号法
显示法
隐式转换法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <iostream> #include <string> using namespace std; class person { public: person() { age = a; cout<<"person的无参构造函数调用"<<endl; } person(int a) { age = a; cout<<"person的有参构造函数调用"<<endl; } person(const person &p) { age = p.age; cout<<"person的拷贝构造函数调用"<<endl; } ~person() { cout<<"person的析构函数调用"<<endl; } int age; }
void test01() { person p; person p2(10); person p3(p2); cout<<"p2的年龄为:"<<p2.age<<endl; cout<<"p3的年龄为:"<<p3.age<<endl; person p1; person p2 =person(10); person p3 =person(p2); person(10); person p4 = 10; person p5 =p4; } int main() { system("pause"); return 0; }
|