C++学习笔记

文章介绍了C++中的内存区域,包括堆区的管理,如何避免野指针问题,以及引用的使用来防止野指针。此外,还讨论了匿名对象的生命周期,拷贝构造函数的作用,&运算符在传递引用和返回对象时的用法,以及浅拷贝和深拷贝的概念。同时,讲解了静态成员变量和函数的特点,强调它们在所有对象间共享且可直接通过类名访问。

存储四区:

堆区的数据由程序员手动开辟,也由其手动释放,这时候在析构函数中进行释放操作。

野指针:

指向非法的内存地址指针,

常见情形:使用未初始化的指针,指针所指的对象已经消亡,指针释放后之后未置空。

如何避免:

(1)C++引入了引用机制,如果使用引用可以达到编程目的,就可以不必使用指针。因为引用在定义的时候,必须初始化,所以可以避免野指针的出现。

(2)如果一定要使用指针,那么需要在定义指针变量的同时对它进行初始化操作。定义时将其置位NULL或者指向一个有名变量。

(3)对指针进行free或者delete操作后,将其设置为NULL。对于使用 free 的情况,常常定义一个宏或者函数 xfree 来代替 free 置空指针:

匿名对象:

当前匿名对象行执行结束后,系统会立即回收,也就是会立即调用析构函数。例:

Person(10); //Person是一个类,调用其有参构造函数,但并没有给其赋名

Person p1 = Person(10);//显示法,调用构造函数构造对象

而非匿名对象在整个函数执行结束才会被回收。

隐式转换法:

Person p4 = 10; //相当于 Person p4 = Person(10)

拷贝构造函数:

Person(const Person & p){

        m_age = p.m_age;

} //如果定义了拷贝构造函数,c++不会提供其他构造函数

关于&的用法:

例:

vector<int>& a; vector<int> a

带&表示传入函数的是vector的引用(即物理位置),函数内部对vector改动,vector就会改变;
不带&表示传入的是vector的复制品(开辟了另一块位置),函数内部对其改动,不会影响原本的vector。

使用*this返回函数本身时,在定义函数时要加&,表明返回当前对象,如果不加,则会创建一个新的对象进行返回。(使用在链式编程思想中,也就是一行代码调用好几个方法)

class Person{
public:
    Person& add(int age){
        this->age = age;

        return *this; // 返回对象本身时,在定义函数时要加&,表明返回当前对象,如果不加,则会创建一个新的对象进行返回
    }
    int age;
}

浅拷贝与深拷贝:

简单的赋值是浅拷贝,

当其他类的对象作为本类的成员时:

创建本类对象会先创建其他类的对象。

静态成员:

1.静态成员变量

所有对象共享同一数据;在编译阶段分配内存;类内声明,类外初始化。

Class Person{
Public:
        static int m_a;
}

int Person::m_a = 100;

可以直接通过类名的方式访问,如使用Person::m_a访问;静态成员变量也可定义访问权限。

2.静态成员函数

所有对象共享一个函数;静态成员函数只能访问静态成员变量,因为静态成员函数可以不需要声明对象而被直接调用,此时若访问非静态成员变量,就无法知道是哪一个对象的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值