C++之String

标准库string类型和字符串字面值

  因为历史原因以及为了与C语言兼容,字符串字面值与标准库std:string类型不是同一种类型。这一点很容易引起混乱,编程时一定要注意区分字符串字面值和string数据类型的使用,这很重要。

  其中在和字符串字面值连接的问题上体现的最为明显

  string类型中’+’是一个重载了的运算符,可以连接字符串,但是需要注意的是,‘+’的使用是在string类型的基础之上的:

1
2
3
4
5
6
7
8
9
10
11
string s1="hello";
string s2="world";
string s3=s1+",";
//正确,s1是string类型,+是string类型的重载运算符
string s4="hello"+",";
//错误,+前面是一个字符串,+并没有被重载
string s5=s1+","+"world";
//正确,第一个+是重载的运算符,s1+","
//仍然返回一个string类型,所以第二个+仍然是重载的运算符
分享到

C++之extern

声明和定义

  为了弄清extern,首先要弄清楚声明(Declare)定义(Define)的区别。

变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。

声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量是我们声明了她的类型和名字。可以通过使用extern关键字声明变量名而不定义它。

const

  另外,我们还需要弄清楚const的作用。

  在原文件中,定义一个变量默认是extern的,即是其他文件可见的,若定义一个变量使用const修饰符,则表明此变量不是extern的,即只有本文件可见(与static的功能类似)。

头文件

头文件中可以定义类、值在编译时就已知道的const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。

通过const和头文件的描述

  我们不难发现const变量为什么默认不是extern的:在头文件中定义的const常量在每个include的源文件中都会定义一遍,但是由于const常量默认是不带有extern的,所以const常量是只能在本文件中存在的。另外,一般在编译过程中,编译器会将const常量替换成相应的字面值,所以在头文件中定义const常量是合理的,且一般不会造成内存使用过多。

在头文件中的extern

extern的主要目的是用于声明,头文件也是用于声明的,所以头文件中的非const变量必须在前面加上extern表明此变量是外部文件定义的。另外在相应的源文件内,定义相应的变量。

例子

1
2
3
4
5
6
7
//file1.h
extern int a;//表示声明一个外部的int型a
int a;//错误,这是一个定义,不应出现在头文件中,若多次被include,会造成重名
const int a;//正确,const默认是其他文件不可见的,只有include的源文件才可见到,并只能在此源文件中存在
分享到