【C++】C & C++常用结构的区别与常见问题(二)

1、C++与C是什么关系?

1) C语言和C++并不是对立的竞争关系;
2) C++是C语言的加强,是一种更好的C语言;
3) C++是以C语言为基础的,并且完全兼容C语言的特性;
4) 学C++并不会影响原有的C语言知识,相反会加深对C认知;
5) C++是Java/C#等现代语言的基础,学C++后能快速握语言;

2、C++有什么特点?
1) 以C语言为基础;
2) 面向对象编程;
3) 类型、函数、异常加强;

3、C++中的命名空间是什么意思?
所谓namespace【命名空间】,是指标识符的各种可见范围。例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光),就好像它们被声明为全局变量一样。当然也可以自己编写命名空间。【C中与C++中namespace特点】

  1. C中的命名空间
    a) 在C语言中只有一个全局作用域
    b) C语言中所有的全局标识符共享同一个作用域
    c) 标识符之间可能发生冲突

  2. C++中提出了命名空间的概念
    a)命名空间将全局作用域分成不同的部分
    b) 不同命名空间中的标识符可以同名而不会发生冲突
    c) 命名空间可以相互嵌套
    d) 全局作用域也叫默认命名空间

```cpp
namespace NamespaceA{
    
    
	int a = 0;
}
void main(){
    
    
using namespace NameSpaceA;
printf("a = %d\n", a);
system("pause");
}

4、关于变量定义C vs C++
1) C语言中的变量都必须在作用域开始的位置定义!!
2)C++更强调语言“实用性”,所有变量可以在需使用时再定义

5、register关键字增强
a)register关键字 请求编译器让变量a直接放在寄存器里面,速度快
b)在c语言中 register修饰的变量 不能取地址
c)C++中可以取得register变量的地址;C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效

6、变量检测增强
1)C语言中,重复定义多个同名的全局变量是合法的;
2)C+不允许定义多个同名全局变量;直接拒绝这种二义性做法

int vars;
int vars=1; //合法,最终C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上,但在C++中就不行.

7、struct类型加强
1)C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
2)C++中的struct是一个新类型的定义声明

struct Student
{
    
    
char name[100];
int age;
};
int main(int argc, char *argv[])
{
    
    
Student s1 = {
    
    "wang", 1};   //新的数据类型student
Student s2 = {
    
    "wang2", 2};
return 0;
}

8、C++中所有的变量和函数都必须有类型
1)C++中所有的变量和函数都必须有类型
2)C语言中的默认类型在C++中是不合法的

//函数f的返回值是什么类型,参数又是什么类型?
//函数g可以接受多少个参数?
//更换成.cpp试试
f(i)
{
    
    
printf("i = %d\n", i);
}
g()
{
    
    
return 5;
}
int main(int argc, char *argv[])
{
    
    
f(10);
printf("g() = %d\n", g(1, 2, 3, 4, 5));
getchar();
return 0;
}
/*
总结:
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型
*/

9、新增Bool类型关键字
1)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.

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;
	}

10、三目运算符功能增强
1)C语言返回变量的值;//相当于 111 = 30,且表达式结果放在寄存器中。
2)C++语言是返回变量本身;C语言中的三目运算符返回的是变量值,不能作为左值使用;C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方。*(a < b ? &a : &b) = 30通过这样的方式实现的。因此C++这样也可以int z =(a < b ? a : b );
2)三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用(a < b ? 1 : b )= 30;
3)C语言如何支持类似C++的特性呢?
====>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已
思考:如何让C中的三目运算法当左值呢?

int main()
{
    
    
int a = 10;
int b = 20;
//返回一个最小数 并且给最小数赋值成3
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b )= 30;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}

11、C/C++中的const
1)const基础知识(用法、含义、好处)

int main()
{
    
    
int t=0;
const int a=0;	//常整型,必须初始化
int const b=1;	//常整型,必须初始化
const int *c = Null;	//向常整形数的指针
int * const d = &t;	//常指针,必须初始化
const int * const e = &a ;	//一个指向常整形的常指针,必须初始化
return 0;
}
Int func1(const )
初级理解:const是定义常量==const意味着只读
含义:
//第一个第二个意思一样 代表一个常整形数
//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
Const好处
//合理的利用const,
//1指针做函数参数,可以有效的提高代码可读性,减少bug;
//2清楚的分清参数的输入和输出特性
int setTeacher_err( const Teacher *p)
Const修改形参的时候,在利用形参不能修改指针所向的内存空间

2)C中“冒牌货”const结构

int main()
{
    
    
const int a = 10;
int *p = (int*)&a;
printf("a===>%d\n", a);  //输出10
*p = 11;
printf("a===>%d\n", a);//输出11被修改。C的缺点,但在C++中以修补
printf("Hello......\n");
return 0;
}

【那么思考C++中是通过什么方式实现的?】

C++编译器对const常量的处理:
	当碰见常量声明时,在符号表中放入常量 =问题:那有如何解释取地址编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)?联想: int &a = 1(err) & const int &a = 10(ok)?

在这里插入图片描述

注意:
C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
结论:
C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用 //分配空间
当使用&操作符取const常量的地址 //分配空间

3)const和#define相同与不同之处
C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5
C++中的const常量与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换

//练习 解释为什么
//#define N 10
int main()
{
    
    
// int a = 1;
//  int b = 2;
// int array[a + b ] = {0};  //这种在c c++中都不行,但是liux支持
const int a = 1;
const int b = 2;
#define N 10
int array[a + b ] = {
    
    0};	//这种也可以
int array[a + N ] = {
    
    0};  //这种可以
int i = 0;
for(i=0; i<(a+b); i++)
{
    
    
printf("array[%d] = %d\n", i, array[i]);
}
getchar();
return 0;
}
C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在const修饰的常量编译期间,就已经确定下来了。
//在func1定义a,在func2中能使用吗?  【可以】
//在func1中定义的b,在func2中能使用吗?【不可以,它有作用域】
练习
void fun1()
{
    
    
#define a 10
const int b = 20;
//#undef a # undef   //卸载宏
}
void fun2()
{
    
    
printf("a = %d\n", a);
//printf("b = %d\n", b);
}
int main()
{
    
    
fun1();
fun2();
return 0;
}

结论:
a) C语言中的const变量
b) C语言中const变量是只读变量,有自己的存储空间

c)C++中的const常量
d)可能分配存储空间,也可能不分配存储空间
e)当const常量为全局,并需要在其它文件中使用,会分配存储空间
f)当使用&操作符,取const常量的地址时,会分配存储空间
g)当const int &a = 10; const修饰引用时,也会分配存储空间

猜你喜欢

转载自blog.csdn.net/qq_32643313/article/details/105193376