C++基础知识(一)基础知识

基本数据类型

C++基本类型的最小存储空间
bool 类型
char 字符型 8位
wchar_t 宽字符型 16位
short 短整型 16位
int 整形 16位
long 长整形 32位
float 单精度浮点型 6位有效数字
double 双精度浮点型 10位有效数字
long double 扩展精度浮点型 10位有效数字
要获得无符号型必须指定类型为unsigned.比如unsigned long

对比java

java中数据的范围和运行java的机器无关,而在C++中,程序会根据不用系统,处理器,编译器选择大小,效率比在java中高
java中没有任何无符号类型
布尔类型,C++中用bool, java中使用boolean,C++中bool和整形值可以相互转换,非零值则为true,零为false.
常量,java中用final,C++中用const.

数组和字符串

数组

C++定义:
静态数组: 数据类型 数组名[常量表达式] 如: int a[20]
动态数组: int *a = new int[20]; //20可以是变量
java定义:int[] a = new int[20];//其中20可以换成变量
C++中有动态数组和静态数组两种,静态数组存储在栈上,动态数组存储在堆,而java中数组使用new 存储在堆。

数组小知识点

数组名和指针,指针常量的异同点:
1. C++将数组铭解释为第一个元素的地址,但还是有点差别,比如:
int a[20];
cout<< sizeof a<< endl;
结果会是数组所占内存大小,而不是一个指针所占内存大小。
2. a不能用于指向其他数据,这点和指针常量相同
3. 当将数组名用于函数头或函数原型时,数组名和指针作用相同,比如:
int sumOfArr(int arr[])和int sumOfArr(int * arr)这两者没有区别,即使用数组名作为形参,实际上传递的也是一个指针,在函数内用sizeof时指的是一个指针占内存的大小,而不是数组的大小,所以也不能用sizeof(数组名)/sizeof(数据类型)去得到数组内的数据个数。并不像java,万物都是类,数组还有length可以用。因此,当用数组作为函数参数时,通常要再加一个参数传递数组长度。

字符串

C++中字符串有两种,一种是继承C语言的,一种是C++的。
C语言中的字符串:
char dog[] = “dog”;
cout<< sizeof dog<< endl;//结果是4,而不是3
相当于char dog[] = {‘d’, ‘o’, ‘g’, ‘\0’};//字符串会多一个’\0’在结尾。
C++中的字符串:
string dog = “dog”;
区别:C语言风格的字符串使用的方法有strlen, strcpy, strcat, strcmp
C++字符串使用string类的length()方法获取长度,复制的话直接用等号复制就可以,如string dogs = dog;此时dogs和dog是两个对象,互不干扰。拼接字符串C++风格和java风格一致,直接使用+号拼接即可。因为string类重载了+号运算符,对比使用compare方法。

指针和引用基本介绍

指针

指针基本介绍

int cat = 5;
int *pt = &cat;//指针初始化使用&取地址
pt = 10;//用修改指针所指向的值

long * fellow;//指针没有初始化会导致bug
*fellow = 2323;

以上将指针初始化为变量的地址,变量是在编译时分配的有名称的内存,而指针只是可以通过名称直接访问的内存提供一个别名。指针真正用途在于,在运行阶段分配未命名的内存以存储值,在C++中使用new 运算符实现。

new在使用时和delete配合,new 申请内存,delete释放内存,并且delete只能用于释放new 申请的内存,而不能用于释放变量所获得的内存。
int * pt = new int;
delete pt;//释放一个变量所占内存
short *ps = new short[500];//.申请一块内存
delete [] ps;//释放数组所占内存

指针运算

定义:将指针变量加1后,其增加的值等于指向的类型所占用的字节数

例子:
short tell[10];
cout< cout<<&tell<
打印的都是数组的地址,但是tell在指针的概念上是指向第一个元素的指针,只是理解上(sizeof tell的话是整个数组所占内存),&tell是指向第一个元素的指针,tell+1加的是2字节内存块地址,&tell+1加的是20字节大小内存块的地址。

引用

引用变量:已经定义的变量的别名。
int cat;
int & tiger = cat;//将虎作为猫的别名
cout<<”tiger address:”<<&tiger<

引用和指针的区别:

引用必须在声明时初始化,而指针不需要。引用和指针常量比较接近,指针常量也需要在创建时初始哈。
指针常量:一个常量,常量的类型是
int * const p;
常量指针:一个指针,指针指向的是常量
const int * p;
int const * p;

引用的作用:

作用一:将引用作为函数参数,按引用传递允许被调用的函数能够访问调用函数中的变量。普通的按值传递导致被调用函数使用调用程序的值的拷贝。作用和指针类似。
作用二:将引用作为函数返回值。如返回结构的引用,那么返回的结构仍然是原来传入的结构而不是重新拷贝的新的结构。
例子:
double m = sqrt(16.0);
值4.0先复制到一个临时位置,然后复制给变量m,其间会产生一个临时变量。
当返回值是引用时,则不需要先复制到临时位置,而是直接把返回的引用变量复制给m.

指针和引用作为返回值时应注意

例子:
int * getInt(){
int a = 10;
return &a;
}

int & getInt(){
int a = 10;
return a;
}

以上两个例子都会报警告,第一个例子的a变量被释放后,指针会成为野指针,第二个例子中所引用的变量也可能被释放。

C++函数参数传递

C++函数参数传递有三种方式:按值传递,按地址传递,按引用传递

按值传递:

void swapv(int a, int b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}

按地址传递:

void swapp(int *p, int *q){
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}

按引用传递:

void swapr(int &a, int &b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}

三种方式使用场景:

对于使用传递的值而不作修改的函数:
如果数据对象是数组,则使用指针,并将指针声明为常量指针
数据对象是很大的结构则使用const指针或者const引用
如果数据对象是类对象,则使用const引用
对于修改调用函数中数据的函数:
如果数据是内置数据类型,则使用指针
如果是数组,只能用指针
如果数据对象是结构,则使用指针或引用
如果数据对象是对类对象,则使用引用

你可能感兴趣的:(c++)