C++

19-10-29-C++primer-基础学习2

C++

Posted by Wangchenchen on 2019-10-29

上一篇对基础部分的编译流程,输入输出,控制结构,进行了介绍,这篇主要是对里面的变量以及基本类型标准库类的简介 进行相关的总结:

变量:

· 什么是变量?

​ 变量提供了程序可以操作的有名字的存储区,c++每个变量都有特定的类型,决定了变量内存大小和布局,能够存储于该内存中的值的取值范围以及可以在这个变量上的操作集,

· 变量组成?

​ 左值: 左值可以出现在赋值语句的左边或者右边。

​ 右值: 只能出现在赋值的右边;

例: int a = 19;

a = a+0;

变量名:

​ 变量名是变量标识符,可以由字母,数字,下划线,组成变量名必须以字母,下划线开头,c++是区分大小写的,变量名不能是已经定义的关键字,比如,string,void, main, int,public等;

申明 定义:

​ 申明: 变量的申明是申明是什么类型,比如int a;在64位的机器中,则是告诉编译器这个变量a在内存中占用8个字节 ;

​ 定义: 对已经声明的变量进行,可以是常量值也可以是表达式,实际的赋值如 a = 1024*20,含义是编译器在内存中开辟出一块存储单元存放变量值:1024;

变量只可以声明一次但是可以定义多次;

变量的作用域:

​ 变量的作用域是可以嵌套的;申明的成员变量可以在同一个类中局部方法中调用;

例:

1
2
3
4
5
6
7
8
9
class Test{
String a = "";
void TestA(){
a = "局部a中可以使用成员变量"
}
void TestB(){
a = "局部b中可以使用成员变量"
}
}

定义成员变量a,在局部变量中又定义同类型的a,这两个不是同一个a在内存中地址不样;

例:

1
2
3
4
5
6
7
8
9
class Test(){
int a = 1024;
void TestA(){
int a = 2048;
a += 255;
cout<<"TestA print a = %d",a;
}
cout<<"test print a = %d",a;
}

上面两个打印出来的a是不样的,第一个TestA打印出来的是2048+255 是 2303,第二个打印出来的内容还是1024;

基本类型:

​ c++定义了一组表示整数的,浮点数,单个字符和布尔值的算数类型 ,另外还定义了一个叫void特殊类型,void没有对应的值,仅仅在有限的情况下用作无返回值函数的返回类型;

​ 算术类型的存储空间依机器而定。这里的存储空间是指用来表示该类型的二进制位(bit)数。

  C++标准规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间,事实上,对于int类型,几乎所有的编译器使用的存储空间都比所要求的大。

  因为位数不同,这些类型所能表示的最大(最小)值也因机器的不同而有所不同。

  

​ 类型+含义+最小存储空间如下:

类型 含义 最存储空间
bool 布尔型
char 字符型 8bit
wchar_t 宽字符型 16bit
short 短整型 16bit
int 整形 16bit
long 长整型 32bit
float 单精度浮点型 6位有效数字
double 双精度浮点型 10位有效数字
long double 扩展精度浮点型 10位有效数字
整形:

​ 表示整数,字符和布尔值的算数类型合成为整型。

​ 字符类型有两种,char和wchar_t,char能够存储机器基本字符集中任何字符相应的数值,因此char通常单个字节(byte);wchar_t 用于扩展字符集中的一些字符,不能用单个字符表示。

​ short, int , long 都表示整型,存储空间大小都不一样,,一般short类型为半个机器字长,int为一个机器字长,而long为一个或两个机器字长,(32位机器中,int和long的字长是一样的);

· 带符号和无符号类型

​ 除了bool其他整型都是可以带符号的(正数),也可以是不带符号的(负数);

​ 整型,int, short,long 默认是带符号的,要不带符号就必须要指定该类型是unsigned,若unsigned后不带任何整型,默认是int

​ char有三种不同的类型,char ,unsigned char , signed char,

· 整型值的表示:

​ 无符号型中,所有的位数都表示数值,如果在某个机器中,定义一种类型使用8位表示,这个类型的无符号型可以取值 2^8 (0-255),同样的类型用signed,则取值范围是-128 ~ 127 或者是 -127 ~ 127;

​ signed中有一位是符号位,表示正负,如果是1则为负数,反之则为正数;

· 整型的赋值:

​ 在赋值时有时会出现赋值的数超过取值范围的情况,这类情况分为无符号类型和有符号类型,比如是unsigned char 8位,正常情况它的取值范围是0-255;如果将336赋值,就会将336进行求模后得到的数 80 存入到 整型中;因为80是336对255求模后的值;

浮点型:

​ float, double, long double 分别表示单精度浮点和双精度浮点以及扩展精度浮点,

​ float: 用一个字32位

​ double: 用两个字节 64位

​ long double: 用三个或四个字节 96-128位

· 字面值规则:

​ 通常可以用十进制和科学计数法来表示浮点字面值常量,使用科学计算法时指数用E或e表示,默认浮点数常量位double,在数值后面加上F或f 同样加上L或l表示扩展精度;

布尔型:

​ bool表示的是真值true和假值false,也可以将算数类型赋值给bool对象, 0值表示的是false,任何非0表示true;

类简介:

​ c++ 通过定义类来定义数据类型,类定义了该类型的对象包含的数据和该类型的对象可以执行的操作,例如,string,istream等标准库都定义成了类;

· 结构 形成

​ 成员变量, 成员函数这个是组成一个类的重要成分;

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
Student.h
struct Student(){
private:
String name;
int age;
int nub;

public
Student(String name int age);
~Student();
String getName();
void setName(String name);
}
1
2
3
4
5
6
7
8
9
10
11
Student.cpp
class Student(){
}

String Student::getName(){
return name;
}

void Student::setName(String n){
name = n;
}
1
2
3
4
5
6
7
8
9
10
main.cpp
include "student.h"
int main(){
String name = "Test"
int age = 26;

Student s = new Student();
s.setName(name);
String nameResult = s.getName();
}

以上就是一个基础的c++程序;

· struct 和class的区别

​ struct也可以定义类类型,这个关键字是继承自c语言,首先使用class定义类那么定义在第一个访问标号前默认是private,如果是struct如果不特别定义默认是public,区别仅此而已;

extern 关键字:

​ extern 可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到这个变量或函数时在其他模块中寻找其定义;

​ 函数:extern ”C“ void fun(); 告诉编译器这个函数要按照c的风格进行编译;

​ 变量: extern int age;它的作用是声明函数或全局变量的作用范围的关键字,申明的变量或函数除了本模块还能在其他模块中使用,但他只是声明不是定义;

​ extern char *a 这样的申明是不正确的,这个的意思是声明的是一个指针变量而不是字符数组因此与实际的定义不同;正确的是 extern char a[];

const 关键字:

​ const 常量 是一个不能被修改的变量;默认是局部成员,但是把它放在全局的位置在任何地方就可以调用;

1
2
const int buff = 1024;
buff = 2048;//错误,const 不能被重新赋值;
引用:

​ 就是对象的另一个名字;申明时在变量前面加上 & 符号就好;

1
2
3
int num = 255;
int &buff = num;
buff += 127;

上面的运行结束后,buff的大小是482;num 不会发生变化;

​ const 引用

1
2
3
4
const int num = 1024;
int &num1 = num;
int &num2; //错误,不能为空;
int &num3 = 10; //错误,不能直接赋值数字;
typedef 关键字:

​ 定义一种类型的别名,不是简答的宏替换;可以用作指针类型的多个对象;

比如:

1
2
typedef char* PCHAR  
PCHAR pa,pb;
1
2
3
4
5
6
7
typedef struct tag
{
int x;
int y;
}POINT;

POINT p1;
两大陷阱

​ 陷阱一:

​ 记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:
先定义:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);

const PSTR实际上相当于const char吗?不是的,它实际上相当于char const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。
简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。

​ 陷阱二:

​ typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef static int INT2; //不可行
编译将失败,会提示“指定了一个以上的存储类”。

枚举:

​ 自定义一组可选择的值,关键字enum;

1
2
3
4
5
6
enum open_modes
{
input,
output,
append
};

第一个默认赋值为0,下面的依次加1,若第二个赋值为20,则第三个自动赋值为21;

总结:

以上就是我对,变量,基本数据类型,类简介,和一些关键字的解释,以及枚举,下面将对标准库类型进行总结,我总结不对的地方希望可以批评指正,谢谢~

E-mail : jsntWangchenchen@outlook.com 王晨晨