深入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; //正确