您的位置:首页 > 编程语言 > C语言/C++

C++开发(2)入门概念学习笔记

2018-01-03 22:34 597 查看

程序执行过程

Created with Raphaël 2.1.2开始01-源文件02-程序预处理03-编译04-链接05-生成可执行程序结束

01-源文件:我们编写的源代码

02-程序预处理:预处理程序处理程序中预处理指令,将处理好的代码发送给编译器进行编译

03-编译:编译器进行编译,将源代码编译成目标代码

04-链接:目标代码和其他源码代码和C++库代码等进行链接

05-生成可执行程序:通过上面的过程生成可执行的程序

命名空间(namespace)

命名控件是指标识符的可见范围,C++标准程序库中的所有的标识符都被定义在一个名为std的命名空间中。为了避免程序设计中,标识符命名发生冲突。所以C++引入的命名空间。

命名空间定义

namespace name{
}
namespace name{
int i = 0;
namespace name1 { //命名控件可以嵌套
int i = 0;
}
}


命名控件使用

int main()
{
using namespace name;
int a;
a = name::i;
a = name::name1::i;
return 0;
}


使用注意

当使用iostream的时候,该头文件没有定义全局命名控件,必须使用namespace std;

这样才能正确使用cout等函数。若不引入using namespace std;可以使用std::cout方式使用.

C++标准为了和C区别开,不使用后缀.h的头文件 命名控件可以嵌套。

关键字register

这个关键字是请求编译器将局部变量存储到寄存器中。放到寄存器中的变量C语言无法获取内存地址,而C++仍然可以获取寄存器变量的内存地址。

变量检测

在C语言中同时定义多个同名变量是合法的,在C++中不允许同时定义多个同名变量。

关键字struct

在C++中struct是一个新类型的定义声明,在C中,C编译器并不认为这是一种新的类型。struct关键字和class关键子完成的功能是一样的,当时他们还是有区别的。

C++类型检测

C++中所有的变量和函数都必须有类型。

类型bool

该类型是C++新增的数据类型。值为:true和false

C++中非0值都为true

bool 类型占用一个字节。

三目运算符

在C语言中表达式的运算结果返回值是变量的值,不能作为左值。

在C++语言中表达式的运算结果返回值是变量的本身,所以可以作为左值。

案例:

#include "iostream"
using namespace std;
int main()
{
int a = 10;
int b = 20;
(a < b ? a : b) = 30;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
return 0;
}


这个案例的三元运算符在C语言中,会提示表达式不能作为左值,而在C++中编译运行通过



表达式在C语言中修改,能达到C++中的效果:

*(a < b ? &a : &b) = 30;


关键字const

const是定义常量。C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const.

C++中const规则

const修饰指针变量时:

(1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

(2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。

(4)const修饰函数参数,传递过来的参数在函数内不可以改变

(5)const修饰成员函数,const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外),const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量

(6)const修饰函数返回值,如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改

(7)const修饰常量,不能通过引用来修改常量值。

C语言中的const

定义常量可以通过指针修改常量的值。在C++中定义的常量通过指针也不能修改

int main()
{
const int a = 10;
int *b;
b = (int *)&a;
*b = 30;
cout << a << endl;
return 0;
}


这段代码在C语言中最后的输出结果是30,但是在C++中输出结果为10。这个现象表明C++中的const 修饰常量,确实不能通过指针来修改值。

const与#define

C++中const常量类似宏定义

const int c = 5; ≈ #define c 5

C++中const常量在与宏定义不同

Const 常量是由编译器处理的,提供类型检查和作用域检查

宏定义有预处理处理,单纯的文本替换

所以C++中的const也用于替换程序中使用宏定义定义常量,使程序更严谨。

枚举(enum)

C++对C语言的枚举进行争强,C语言枚举本质就是整形,枚举变量可以用任意整形赋值,而C++中枚举变量,只能用被枚举出来的元素初始化。

#include "iostream"
using namespace std;
enum MyEnum
{
aaa,
bbb,
ccc

};
int main()
{
enum MyEnum s = aaa;
if (s == aaa)
{
cout << "判断正确" << endl;
}
return 0;
}


C++中的引用

C++中新增了引用的概念。引用可以看作一个已定义变量的别名。引用是C++的语法范畴。实际上就是为一个已经定义的变量起的别名。普通引用必须要初始化,只声明引用编译器会报错。

引用语法:

Type& name = var;


int x = 10;
int &y = x; //y就是X的引用
y = 100;
cout << "x:" << x << endl;
cout << "y:" << y << endl; //y就是x的别名


引用作为函数的参数

引用在作为函数的参数时,不进行初始化。因为引用是已经定义变量的别名。也就是说引用和变量名实际都指向一个内存地址,我们通过这个特性来实现两个变量交换数据的案例。

#include "iostream"
using namespace std;
void mySwap(int &x, int &y);
int main()
{
int x = 10;
int y = 100;
mySwap(x, y);
cout << "x:" << x << endl;
cout << "y:" << y << endl; //y就是x的别名
return 0;
}
void mySwap(int &x, int &y)
{
int t = 0;
t = x;
x = y;
y = t;
}


交换两个变量的数据可以使用引用或者指针都能实现。引用作为气态变量的别名而存在,因此在某些场合可以代替指针。引用相对指针来说具有更好的可读性和实用性。

引用的本质

引用单独定义的时候,必须初始化。引用在C++中的内部实现是一个常量指针。因此引用占用的控件大小与指针相同。当实参传给形参应用的时候,只不过是C++编译器帮我取了一个实参地址传给了形参引用(常量指针)。

函数返回值是引用

当函数返回值为引用时:

若返回栈变量,不能成为其他引用的初始值,不能作为左值使用

若返回静态变量或全局变量,可以成为其他引用的初始值,即可作为右值使用,也可作为左值使用

指针引用

指针对指针起的别名

常引用

我们创建的引用是const修饰,那么我们不能通过引用来修改变量值。

常引用初始化

使用变量初始化引用
int a = 10;
const int &d = a; //使用变量a初始化常引用
使用字面量初始化
使用字面量初始化普通的引用,编译器报错,因为字面量没有自己内存地址。但是如果是const修饰的引用,可以使用字面量进行初始化。为什么呢?const引用在初始化过程中,程序会为引用分配内存空间,而后将字面量存储到该内存空间中。


指针

一级指针:一个指针变量存储的是一个普通变量的地址,像这样的指针我们称之为一级指针

二级指针:一个指针变量存储的是一级指针变量地址。称为二级指针

三级指针:一个指针变量存储的是二级指针变量地址。称为三级级指针

N级指针:一个指针变量存储的是(N-1)级指针变量地址。称为N级级指针

注意:

一级指针只能存储普通变量地址

二级指针只能存储一级指针变量地址

三级指针只能存储二级指针变量地址

N级指针只能存储N-1级执政变量地址

声明多级指针

void main()
{
int a = 10;
int* b = &a;
int** c = &b;
cout << "a:" << a << " &a:" << &a << endl;
cout << "b:" << *b << " &b:" << &b << endl;
cout << "c:" << **c << " &c:" << &c << endl;
system("pause");
}


b57a
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 入门 入门教程