目录
内部类
内部类分为两种:公有的内部类与私有的内部类
但是它受访问限度符限制
内部类在类里面声明不占空间,定义才占空间
定位了一个B类就变成了12;
内部类是外部类的天生友元;
内部类能够访问外部类的数据,但外部类不能访问内部类的信息
匿名对象(即用即销毁)
类名+(参数)
匿名对象具有常性
const A& ra = A(2);//const引用延长匿名对象的生命周期,生命周期在当前函数局部域,
//匿名对象
class A
{
public:
//构造函数
A(int a=1)
:_a(a)
{
cout << "A(int a)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a=1;
};
class Solution
{
public:
Solution()
{
}
~Solution()
{
cout << "~Solution()" << endl;
}
int Sum_Solution(int n)
{
cout << "Sum_Solution" << endl;
return n;
}
};
int main()
{
A a(2);//有名对象--生命周期在当前函数局部域
//匿名对象即用即销毁
A(2);//匿名对象--生命周期在当前行
A();//可以理解成后面就没人用了,就直接销毁了
// A& ra = A(1);//匿名对象具有常性
const A& ra = A(2);//const引用延长匿名对象的生命周期,生命周期在当前函数局部域,
//可以理解为因为后面ra还会用这个匿名对象,所以没有销毁
//创建对象,调用函数
Solution b;
//有名对象不能这样写 Solution A(); 因为编译器不知道这是对象,还是函数声明
b.Sum_Solution(10);
//匿名对象调用函数,还是会先走构造函数,再进入调用的函数,必须加一个括号,
//有默认构造函数不要传参,没有的话正常传参
Solution().Sum_Solution(10);
//Solution::Sum_Solution(10);错误调用,没有this指针可以传递
return 0;
}
带const和不带const的类型是不一样的
可以构成函数重载
编译器对构造的优化
在同一行一个表达式中发生连续的构造+拷贝构造,优化合二为一
优化
A aa=1;
不优化
A aa1;
Func(aa1);
出现这种情况要尽量写成一行
C/C++内存管理
地址自上向下依次降低
语言角度看待叫做静态区,系统角度叫做数据段
常量区/代码段
建立栈帧的本质是为了存储局部数据,还有进行递归调用
因为程序有不同的需求,所以需要分配内存,划分区域
c c c a a
a a a d a b
strlen遇到'\0'截止,不算'\0'
32位指针大小是4,64位指针大小是8
*数组名时,数组名代表首元素地址
sizeof(数组名),数组名代表整个数组
const不会影响数据存储的区域,不能认为加了const是在常量区
可以看到a和b的地址挨得很近,所以可以判断,b也是在栈上
扩容空间不够时,realloc会自动销毁原先的空间,然后将数据转移到新的位置;
new和delete(配对使用)
,不能跟free混搭,可能会出现未知问题
new和malloc的区别
malloc 开空间
new 开空间+调用对象的构造函数初始化
struct ListNode
{
int _val;
struct ListNode* _next;
ListNode(int x)
:_val(x)
, _next(NULL)
{}
};
struct ListNode* BuyListNode(int x)
{
// 单纯开空间
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
// 检查
newnode->_next = NULL;
newnode->_val = x;
return newnode;
}
int main()
{
struct ListNode* n1 = BuyListNode(1);
struct ListNode* n2 = BuyListNode(2);
struct ListNode* n3 = BuyListNode(3);
// 开空间+用对象调用构造函数初始化
ListNode* nn1 = new ListNode(1);
ListNode* nn2 = new ListNode(2);
ListNode* nn3 = new ListNode(3);
return 0;
}