C++基础知识第一天

cpp软件架构狮 2018-07-17 23:29:59

1.封装,继承,多态。

2.作用域运算符(::)

:: 前面不写东西,表示调用全局变量

3.名字控制(命名空间(namespace)):

1)命名空间只能在全局范围内定义

2)命名空间可以嵌套命名空间

3)命名空间是开放的,可以随时向命名空间添加东西(变量,函数,类等)。

4) 声明和实现可分离

5) 匿名命名空间,默认此空间中的函数,变量等只在当前文件中有效,相当于给每个变量、函数前加入static.

namespace TestA

{

int a; //这是在命名空间中未初始化的定义。 当在命名空间进行定义时,而且此命名空间放在头文件,当在其他文件进行调用时,会产生重复定义的问题,编译不过。

int b = 9; //这是在命名空间中初始化的定义

extern int c; //这是命名空间中的声明。

}

4.条件编译

#pragma once (第一种)

#ifndef ___ ; #define _____; #endif; ____ 代表一个定义的名字。(第二种)

5.bool 类型:

bool 类型的变量可以把"任何非0值"转换为1.

6.三目运算符:C和C++的区别:

C语言中,三目运算符返回的是一个变量的值,没有内存空间,不可以修改。

int a = 10;
int b = 20;
a > b ? a : b;
(a > b ? a : b) = 30(不可以这样操作,原因如上);

C++语言中,三目运算符返回的是一个变量本身,具有内存空间,可以修改。

int a = 10;
int b = 20;
a > b ? a : b;
(a > b ? a : b) = 30(可以这样操作,原因如上)

7.当一个变量有内存空间时(只要在堆栈区),就可以通过它的地址修改内存里的值

8.const 的使用

如:C语言中,const 修饰的变量是一个只读变量,具有内存。

C++语言中,const 修饰的为常量不具有内存(有额外情况,下面有),它放在符号表中。

1)C++ 中两种情况不一样

const int a = 10; 此时 a 不具有内存,(用一个常量初始化)它放在符号表中。所以不可以对它进行修改。

int b = 9;

const int a = b; 此时a 具有内存(在栈区),因为对它进行赋值的是一个变量b(栈区),可以通过指针间接赋值改变 a 的值。

(上面这种情况为用一个变量初始化 const 变量,所以它可以修改)。

2)在局部变量中。( C语言和 C++ 语言这种情况不一样)

C++语言中:
const int a = 9;
int *p = (int *)&a;
*p = 99;

此时当对 const 常量 a 取地址,编译器会为它分配地址(在栈区);但是 a 常量从符号表中取值,不可被修改。

*p 修改的只是分配的内存空间的值。打印结果: a = 9; *p = 99;

C语言中,变量 a 可以被修改。

3)在全局变量( C语言和 C++ 语言这两种情况一样)

extern const int a = 9;
int *p = (int *)&a;
*p = 99;(第一种)


const int a = 9(它放在全局变量);
int *p = (int *)&a;
*p = 99(第二种);

此时对 const 变量 a 取地址或声明 extern 时,编译器会为它分配地址(在只读变量区);这段代码可以编译通过,但是运行阶段会报错,不以被运行。

4)C语言中 const 修饰的变量为外部链接(和普通变量一样)。

C++语言中,const 修饰的变量为内部链接(和普通变量不一样)。

不管是C语言还是C++ 语言,普通变量都是外部链接。

5)const 与 #define 的不同, const 有类型,有作用域,可进行编译器类型安全检查。

#define 无类型,不重视作用域(从定义开始到文件结尾),不可以进行安全检查。

9.extern 的使用

适用范围是不同文件之间变量的调用。(不可以再同一文件不同函数之间使用)

在不同文件之间调用一个外部链接的变量时,只用在调用的文件中写一个 extern 关键字就可以了。

当调用一个内部链接时,需要在被调文件和调用文件中都写 extern 关键字。

10.变量可以定义数组

int n = 9;
int arr[n];

不同编译器编译环境效果不同。在vs2013中不可以通过;在QT,linux中可以通过。支持C99的编译器可以通过。

11.using 编译指令与 using 声明的区别

namespace A{ int a = 9; func(){} }

namespace B{int a = 9; func(){} }

using 声明: int main(){using A::a; cout << a <

using 编译指令:int main(){using namespace A; cout <

此时打印最近定义的那个。

int main(){ using namespace A; using namespace B; cout << a << endl; } 此时就会报错。编译器不知道选择哪个a

注意:使用using声明或using编译指令会增加命名冲突的可能性。也就是说,如果有名称空间,在代码中

使用作用域解析运算符,则不会出现二义性。

12.在 C 语言中,重复定义多个同名的全局变量是合法的(不正规),但在C++ 中是不合法的。

本页共66段,2436个字符,5062 Byte(字节)