C++核心编程笔记之封装

C++核心编程笔记之封装

1.内存分区

代码区:存放函数体的二进制代码,由操作系统进行管理;
全局区:全局变量,静态变量,常量(const修饰的全局常量和字符串常量);
栈区:函数参数值,局部变量,自动分配释放;
堆区:程序员分配,主动或自动回收;

2.new操作符

//在堆区开辟内存,存放一个int类型的变量,变量值为10;
new int10);
//使用new创建会返回对应数据类型的指针;
int * p = new int(10);
//释放
delete p;
//使用new创建数组,数组通过循环来赋值;
int * p = new int[10];
//释放数组
delete [] p;

3.引用

int a = 10;
int & b =a;//b是变量a的别名
引用必须进行初始化,可以再次赋值即改变指向地址的取值,但不能够改变指向;
引用的本质相当于是指针常量;
引用可以作为参数,也可以作为函数的返回值;
常量引用const修饰后,可以输入const修饰的值;

4.函数提高专栏

函数默认参数:
int func(int a = 1,int b = 2){
int c;
c = a + b;
return c;
}

函数占位参数;

函数重载:
作用:函数名可以相同,提高复用性;
条件:
1.同一作用域;
2.函数名相同;
3.函数参数类型或顺序或数量不同;
注意:返回值不同不能作为判断条件;
引用也可以作为函数重载的条件;
注意形参中有默认参数时引发歧义调用的问题;

5.类和对象

面向对象三大特性:封装,继承,多态;

class 类名 {//设计类的语法
访问权限:
属性;//实际上是类中的常量变量;
行为;//实际上是函数
}
class student{
public:
string name;
void initname(){cin>>name;};
void initold(){cin>>old;};
void getold(){cout<<ld<<endl;};
protected:
int old;
}

访问权限:public;protected;private;
对象抽象出的模板就是类,而类实例化后即是具体的对象;

stduent tpf;//类名 对象名;可以定义对象
tpf.initname("唐鹏飞");
tpf.name = "唐鹏飞"//公共权限下的属性可以通过类内函数或者直接访问;
tpf.initold(22);//受保护的数据或私有数据只允许类内访问(即通过类内定义的方法函数)。

struct结构体 和 class类的唯一区别在于默认的访问权限不同,结构体默认为公共,class类默认为私有。

成员属性设置为私有的好处在于,可以自己通过类内函数控制读写权限,而在写的同时可以对输入的数据有效性作出限制。

6.对象的初始化和清理

构造函数
作用:用于初始化,创建对象时为对象的成员属性幅值;
语法:类名(){};
语法示例:student (){};
注意事项:
构造函数既没有返回值也不写void;
构造函数名与类名相同;
构造函数可以有参数,所以可以发生重载;
创建对象时构造函数会自动调用,并且只会调用一次;

//首先,构造函数是被定义在类里面的,示例在student类中,主要有三种类型;
//1.无参默认构造函数:类名(){}
student (){};
//2.有参构造函数:类名(形参){};
student (int a){};
//3.拷贝构造函数:类名 (另一个对象){};
student (const  student & t){};
//调用构造函数有三种方法;
括号法、显式法、隐式法;

拷贝函数的调用时机:
1.使用一个已创建的对象来初始化一个新对象;
2、采用值传递的方式给函数参数赋值;
3.以值方式返回局部对象;

构造函数调用规则:
用户定义有参构造函数后,系统就不会再提供无参默认构造函数;
用户定义拷贝构造函数后,系统就不会再提供其他的构造函数;
用户没有提供拷贝构造函数,系统会提供基于浅拷贝的拷贝构造函数;

析构函数
作用:在对象销毁之前自动调用执行一些清理工作;
语法:~类名 (){};
注意事项与构造函数相同,但析构函数没有参数,所以不支持重载;

浅拷贝与深拷贝的区别
浅拷贝:简单的赋值拷贝操作;
深拷贝:在堆区重新申请空间进行拷贝操作;
首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会影响另一个,而对于对象或者引用数据来说在进行浅拷贝时,只是将对象的引用复制了一份,也就内存地址,即两个不同的变量指向了同一个内存地址(浅拷贝),那么在改变任一个变量的值都是该变这个内存地址的所存储的值,所以两个变量的值都会改变。
深拷贝和浅拷贝是指在赋值一个对象时,拷贝的深度不同。
在进行深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深拷贝,直到最底层的基本数据类型为止。这意味着,对于深拷贝后的对象,即使原对象的属性值发生了变化,深拷贝后的对象的属性值也不会受到影响。
相反,浅拷贝只会拷贝对象的第一层属性,如果这些属性是对象,则不会对这些对象进行拷贝,而是直接复制对象的引用。这意味着,对于浅拷贝后的对象,如果原对象的属性值发生了变化,浅拷贝后的对象的属性值也会跟着发生变化。
如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的重复释放堆区问题;

初始化列表
作用:用于初始化属性;

//传统方式初始化
student (string a,int b){
name = a;
old = b;
}
//初始化列表方式
student (string a, int b):name(a),old(b){}

对象成员

//定义:一个A类的对象a是另一个类B的成员;
class A {}
class B{
A a;
}

构造时,先调用对象成员的构造函数,再调用本类的构造函数;
析构函数调用顺序相反;

静态成员关键字:static
包括:静态成员变量和静态成员函数;
静态成员变量:
1.类内声明,类外初始化;
2.在编译阶段分配内存;
3.所有对象共享同一份数据;
静态成员函数:
1.所有对象共享同一份函数;
2.静态成员函数只能访问静态成员变量;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值