2023.5.10(C++笔记)

文章讨论了C++中的内部类,包括其分类和特性,指出内部类可以访问外部类的私有成员。接着介绍了匿名对象的概念,即即用即销毁的对象,并展示了如何通过const引用延长其生命周期。此外,文章还涉及了编译器的构造优化以及C/C++内存管理,包括栈、堆和静态存储区的区别,以及new、delete与malloc的差异。最后提到了new运算符在创建对象时同时调用构造函数的功能。
摘要由CSDN通过智能技术生成

目录

内部类

内部类是外部类的天生友元;

匿名对象(即用即销毁)

编译器对构造的优化

 C/C++内存管理

new和delete(配对使用)

new和malloc的区别


内部类

内部类分为两种:公有的内部类与私有的内部类

但是它受访问限度符限制

内部类在类里面声明不占空间,定义才占空间

定位了一个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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值