c++部分知识点整理

一. 内容简介

c++一些知识整理,视频看的是
千锋教育_C++全套视频教程(通俗易懂)(https://www.bilibili.com/video/BV1z5411p7Xh?p=53&spm_id_from=pageDriver&vd_source=de2dcd0f37ff916ec3f8fb83c6366123)

二. 知识点

拷贝构造函数
是把b对象里面的值都给a了进行了简单的值拷贝,和有参构造类似,只是数据来源不同

person (const person& c){
    
    

}
person a(b)

匿名对象,没有名字的对象,不能使用匿名对象调用拷贝构造

// 显示调用构造函数
// 相当于先写了一个匿名对象,然后用p1给他一个名字,在栈中申请内存
person p1 = person();
// 在堆中申请内存
person p1 = new person();
// 隐式调构造函数,一般不用
// 类前面加上explicit就不允许隐式调用了

拷贝构造的调用时机

// 1. 就对象初始化新对象
person p2 = person(p);// 调用了拷贝构造函数
person p3 = p;// 这个也是调用了拷贝构造函数(隐式调用,隐式调用是把person去掉)
// 2. 传递的参数是普通对象,函数参数也是普通对象,传递i将会调用拷贝构造
void aa(person p){
    
    };
person a;
aa(a);
// 3. 函数返回局部对象
person p; 
return p;

深拷贝,浅拷贝:只拷贝数值叫浅拷贝。

// 浅拷贝拷贝地址时候,两个对象指向的是同一块内存,这就是问题
// 深拷贝有些时候要自己写,
// 值的话直接拷贝,地址需要在申请内存,然后在拷贝数据

初始化列表写法,按照声明顺序进行定义初始化

// 原来的那种就是复制的,变量一开始就是定义,而列表写法一开始是声明,声明不分配空间,定义分配空间,声明对象不会调用构造函数,构造调用的也是先构造里面的,在构建外面的
person {
    
    
public: 
	person(int a,int b,int c):m_a(a),m_b(b),m_c(c){
    
    };
	int m_a;
	int m_b;
	int m_c;
}

动态申请内存,都是在堆内存申请的,

// c语言中malloc和free不会调用对象对应的构造函数和析构函数,所以要用new和delete
void *p = new person;
delete p;
// 是不会调用析构函数,应该是不清楚数据的大小
// 创建数组,释放时候也要按数组释放的, new和delete要采用相同的形式

statci存储在静态存储区,并没有在堆区或者栈区,静态成员只有一个拷贝,这个拷贝被所有的属于这个类的对象共享。在编译阶段就分配了内存,且静态成员在类中只能声明。不能赋值,也可以通过类直接访问静态成员变量(是因为编译之前就已经存在了),
类的友元
全局函数称为类的友元函数,就可以在里面访问类的私有成员。
静态成员函数,只能访问静态静态成员,也可以通过类直接调用,在编译时候就有了,类的对象都没有实现的,所以其他的成员没有办法访问。

const static int c = 100;// 不可修改的,const修饰的静态成员变量是保存在常量区,不可修改,在内存中只有一份,可以初始化赋值,
// 访问还是和之前一样额,只不过就是不可更改了

单例模式
一个类只能实例一个对象,不可实例多个
在这里插入图片描述
成员变量和函数存储,只有普通的成员变量才占用对象的内存,静态的在静态存储区存放,函数是在代码区存放

const修饰的成员函数

// 这样的话,就不能通过this来修改对象里面的值了
class MyClass {
    
    
public:
    void modifyVariable();               // 非常函数
    void readVariable() const;           // 常函数
};

void MyClass::modifyVariable() {
    
    
    // 修改成员变量的值
}

void MyClass::readVariable() const {
    
    
    // 读取成员变量的值,但不能修改它们
}

友元

// 如果想要让一个全局函数,或者一个类的成员函数访问另一个类私有成员,只需要声明友元即可
// friend 关键字只出现在声明处
// 其他类,类成员函数,全局函数都可以声明为友元,但是感觉不太好,类外直接更改私有函数不太安全
// 添加友元以后可以直接访问类的私有成员

智能指针

person *p = new person(10);
Smartpointer sp(new person(10));
// 这种传值的话,里面如果给他释放了还好,如果没有释放就不能这么传

函数对象

person p;
p(3,4);

父类中的private子类没办法继承的,不可访问 ,可以这么理解,继承是这样继承的,继承完事以后,子类无法访问父类的private修饰的变量的。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45179361/article/details/131340938