0%

C++ - 基础

最近在学习 C++,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习C++的童鞋们提供一份参考。

C++基础

C++易犯错误模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

class circle
{
public:
double r;
double pi = 3.1415926;
double area = pi * r * r; //area的值在编译分配内存初就被定义
};


int main()
{
circle c1;
cout << "输入圆的半径:";
cin >> c1.r; //可以改变r的值,但是结果错误
cout << c1.area << endl;
return 0;
}

struct-class访问控制

struct和class关键字是一样的,struct定义的类默认为public权限,class定义的类默认为private;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;

class AA
{
int a;
int b;

};


struct BB
{
int aa;
int bb;
};


int main()
{
AA a; //class定义的类不可以通过直接点出来,因为它本身是私有成员属性
BB b;
b.aa = 100;
b.bb = 200;
cout << b.aa << endl;
cout << b.bb << endl;
return 0;
}

namespace和iostream

namespace

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,

在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,

标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;

namespace NameSpaceA
{
int a = 0;
}

namespace NameSpaceB
{
int a = 1;

namespace NameSpaceC
{
struct Teacher
{
char name[10];
int age;
};

}
}

int main()
{
using namespace NameSpaceA;
using NameSpaceB::NameSpaceC::Teacher; //::域作用符

printf("a = %d\n", a);
printf("a = %d\n", NameSpaceB::a);

Teacher t1 = { "aaa", 3 };

printf("t1.name = %s\n", t1.name);
printf("t1.age = %d\n", t1.age);

system("pause");
return 0;
}

iostream

iostream是指iostream库;

register

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。

函数检测增强

在C语言中,重复定义多个同名的全局变量是合法的

​ 在C++中,不允许定义多个同名的全局变量

C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int g_var;
int g_var = 100; //重定义,编译失败

int main()
{
int g_var = 200;
printf("%p\n", &g_var);
system("pause");
return 0;
}

bool类型

C++中的布尔类型

​ C++在C语言的基本类型系统之上增加了bool

​ C++中的bool可取的值只有true和false

​ 理论上bool只占用一个字节,

​ 如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现

​ true代表真值,编译器内部用1来表示

​ false代表非真值,编译器内部用0来表示

​ bool类型只有true(非0)和false(0)两个值

​ C++编译器会在赋值时将非0值转换为true,0值转换为false

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
int a;
bool b = true;

printf("b = %d, sizeof(b) = %d\n", b, sizeof(b));

b = 4;
a = b;

printf("a = %d, b = %d\n", a, b);

b = -4;
a = b;

printf("a = %d, b = %d\n", a, b);

a = 10;
b = a;

printf("a = %d, b = %d\n", a, b);

b = 0;

printf("b = %d\n", b);

system("pause");
return 0;
}

三目运算符

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

void main()
{
int a = 200;
int b = 20;
(a < b ? a : b) = 40; //首先查看条件是否成立
printf("a = %d b = %d", a, b);
system("pause");
}

C语言中也可以实现三目运算符:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a = 10;
int b = 20;
*(a < b ? &a : &b) = 30;
printf("a = %d b = %d\n", a, b);
return 0;
}

const

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main()
{
const int a;
int const b; //代表长整型数 在CPP中,const必须赋初值

const int *c; //一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
int *const d; //常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
const int *const e; //指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)

return 0;
}


C语言中的const变量

  • C语言中const变量是只读变量,有自己的存储空间

C++中的const常量

  • 可能分配存储空间,也可能不分配存储空间

  • 当const常量为全局,并且需要在其它文件中使用

  • 当使用&操作符取const常量的地址

当碰见常量声明时,在符号表中放入常量 =è问题:那有如何解释取地址

编译过程中若发现使用常量则直接以符号表中的值替换

编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)

0

C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。

define

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

  • const int c = 5; ≈ #define c 5

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

  • const常量是由编译器处理的,提供类型检查和作用域检查
  • 宏定义由预处理器处理,单纯的文本替换