深入C++ (1)

本文探讨了C++中易被忽视的编程细节,包括自我初始化的限制、指针与内存的关系、指针偏移的理解、字符串处理的注意事项、string类的char*转换问题、const常量的使用规则以及引用的创建规则。通过实例解析了这些知识点,帮助开发者避免常见错误。
摘要由CSDN通过智能技术生成

深入C++

本文主要细数C++中常常容易让人忽略的或者说十分有用的东西.

1. int a = a 不可行!

​ 理论上,在对象的定义中,当对象的标识符在定义中出现后,对象名马上就是可见的,因此用对象初始化它自己是合法.然而,在vs2013上测试了一下,直接报错a未初始化…

2. 指针与内存

​ 指针的类型可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元.

3. 同时定义多个指针

​ float *var1, var2

​ var1是float*指针变量,而var2只是一个float变量.

4. 指针的偏移

1>.先观察下面一段代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	int num1;
	int num2;
}node;

int main()
{
	node *a = (node *)malloc(sizeof(node));
	a->num1 = 1;
	a->num2 = 2;

	int *p = &a->num1;
	p += 1;
	printf("*p = %d\n", *p);
	
	return 0;

}

最后运行结果是2,原因是指针的+1是在内存中跨越1个指针对应类型字节后的结果,对int而言,就跨越了4个字节,因为结构体中num1和num2是挨着的,所以跨越了4个字节后,就指向了num2.

2>.对于计算指针字符串长度和输出字符串,观察下面代码错误之处:

#include <iostream>
using namespace std;
const char *st = "Test\n";

int main()
{
	int len = 0;
	while (*st++) ++len;
	cout << len << ":" << st << endl;
}

该字符串在自增偏移到最后一个空字符后再输出它的值也是空的了.这就是错因.

5. string类的char*转换

​ 下面代码是错误的:

string s("Test\n");
char *str = s.c_str();

​ 错误原因是string类型的c_str()方法返回的是const char*而此处用的char*去接收,产生类型不匹配,正确写法应该是 const char* str = s.c_str();

6. const常量

​ 常量在定义的时候必须被初始化,未初始化的常量将导致编译错误

const int a;	//错误
const int a = 1;	//正确

7.常量与指针

​ 1>.指向常量值的指针:const int *a = &xxx.;

​ 2>.指向普通值的常量指针:int *const a = &xxx;

​ 3>.指向常量的常量指针:const int *const a = &xxx;

对于第一种情况,该指针不能修改指向地址中的值,但是可以修改指针指向的地址.

对于第二种情况,该指针不能修改指针指向的地址,但可以修改指向地址中的值.

对于第三种情况,两者都不能修改,只能读.

8.引用的创建

引用必须被初始化为指向一个对象,一旦引用定义好了,就不能再指向其他对象了,同时这也是为什么引用必须在创建的时候就指向一个对象.

int a = 1;
int &var;	//错误
int &var = a;	//正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浔汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值