? ? ? ? 假如B是从A继承的,B的对象可以访问A中定义的公有(public)和保护(protected)成员,包括a数组。所以,B类的对象可以使用a数组。
? ? ? ? 然而,反过来则不行。A类的对象不能访问B类的成员,因为B是A的派生类,而不是反过来。所以,A不能使用B初始化出来的b数组。
? ? ? ? 这是面向对象编程中的一个基本原则:一个派生类可以访问其基类的公有和保护成员,但是基类不能访问派生类的成员。
? ? ? ? 在C++中,析构函数是一个特殊的成员函数,它在一个对象的生命周期结束时被调用,用于执行一些清理工作。析构函数的名称是在类名前加上波浪符。
? ? ? ? 例如,对于一个名为A的类,它的析构函数将被命名为`~A()`。当一个对象被删除或者超出其作用域时,析构函数就会被自动调用。通常,析构函数用于释放对象可能拥有的资源,例如动态分配的内存或者打开的文件句柄。
? ? ? ? 模板函数的定义以关键字template开始,后面跟着一对尖括号<>,其中包含一个或多个模板参数。模板参数可以是类型参数,也可以是非类型参数。类型参数通常用class或typename关键字声明,表示可以是任何类型。
? ? ? ? 模板函数的主要优点是它们可以用于多种类型,而不需要为每种类型都编写一个单独的函数。这可以减少代码重复,并提高代码的复用性和可维护性。
指针的星号
? ? ? ??*a = 10;?是将指针a指向的整数设置为10。
? ? ? ??a = new int[256];?是将指针a指向一个新分配的整数数组的内存地址。
? ? ? ??就是说如果使用指针的时候,带星号去使用,就是改变指针所指向的实际整数的值
? ? ? ? 而不带星号去使用,则是改变指针所指向的内存地址,或指针赋值给另外一个指针。
指针类型转换
? ? ? ??ptr1 = (T1*)ptr2;这行代码是将ptr2指针强制转换为T1类型的指针,然后将结果赋给ptr1。
? ? ? ?它并没有改变ptr2所指向的原始数据,也没有开辟新的内存。它只是创建了一个新的指针ptr1,并将其设置为和ptr2相同的地址,但是ptr1的类型是T1*,而不是ptr2的T2*类型。
? ? ? ? 这是一种类型转换,它改变了你如何解释这块内存中的数据,但并没有改变内存中的实际数据。
资源释放
? ? ? ? 在C++中,不应该直接删除指针,而是删除指针所指向的内存。当你使用new操作符动态分配内存时,你需要在不再需要这块内存时使用delete操作符来释放它。在删除指针所指向的内存后,指针本身仍然存在,但它的值(即它所指向的地址)已经不再有效,在这种情况下,你应该避免再次使用这个指针,除非你将其重新赋值为一个有效的地址。一种常见的做法是在删除内存后立即将指针设置为nullptr。
? ? ? ? 即,先执行delete ptr; 再执行ptr = nullptr;
? ? ? ? 内存泄露:当程序通过new
或malloc
等函数分配了一块内存,但是没有通过delete
或free
等函数释放它,就会发生内存泄漏。直接将一个指向动态分配内存的指针设置为nullptr,而没有先释放那块内存,那么那块内存也会被泄漏。
? ? ? ? 悬挂指针:悬挂指针通常是由于释放了一块内存,但是没有将所有指向这块内存的指针设置为null。当一个指针指向一块已经被释放的内存,我们称这个指针为悬挂指针。如果你试图通过悬挂指针访问或者修改内存,结果是未定义的。