本节课主要讲的是C++类中:深拷贝、内联函数、数据成员
提示:以下是本篇文章正文内容,下面案例可供参考
在拷贝构造中,我们的指针不能直接赋值,所以我们就要使用深拷贝
指针内存拷贝
//使用memcpy/strcpyd内存拷贝
怎么使用:
class Students
{
public:
int* p;
int a;
Students()
{
a = 10;
p = &a;
cout << "Student 构造函数" << endl;
}
Students(Students&stu)
{
p = new int;//在使用现在的指针p时,需要先申请空间
memcpy(p, stu.p, sizeof(stu.p));//参数1:存储的变量,参数2:给参数1的地址,参数3:拷贝构造的指针大小
}
};
Students stu;
Students stu2(stu);
解决拷贝构造所引发的指针成员二次释放崩溃的问题的方式
深拷贝
传地址
传引用
常规函数调用过程
调用时根据函数地址
跳到函数代码空间,执行指令
执行完,再跳转到调用的位置
综合:来回跳跃+记录跳跃的位置==一定的系统开销(资源+时间)
内联函数:用相应的代码替换调用
比常规函数稍快
代价是占用更多内存
关键字:inline
inline void fun()
{
cout<<"inline fun"<<endl;
}
函数声明要加inline
函数定义要加inline
注意:只在声明位置写inline不管用
特点
时间和空间
1.看实际需要
空间换时间
时间换空间
2.看性价比
实际
函数代码少,流程直接,调用频繁
循环里的
编译器智能
程序员请求将函数作为内联函数时,编译器不一定会答应
函数体过大
递归不能是内联函数
效果:写了等于没写,按常规函数进行编译
这个特性是编译器特性,即不是所有编译器都实现了这一功能
内联函数比宏功能更强
类内定义都是内联函数
显式定义
隐式定义
类外定义
有inline 是内联
没有inline不是内联
相对特殊
引用成员
初始化列表
const成员
初始化列表
静态成员
类外初始化
无this指针
静态常量成员
可在类内直接初始化
也可在类外初始化
指针成员
注意拷贝构造产生的问题
this
作用
区分同名的
是指向当前对象的指针
所以可以通过指针访问成员
对象创建的时候才有
类型
对应对象的类的指针类型
this指针不是成员
this作用域是在类内部,系统默认传递给函数(非静态函数)的隐含参数