C++笔记 第二课 C到C++的升级---狄泰学院

版权声明:原创·禁止转载 https://blog.csdn.net/weixin_42187898/article/details/83107385

如果在阅读过程中发现有错误,望评论指正,希望大家一起学习,一起进步。
学习C++编译环境:Linux

第二课 C到C++的升级

1.C与C++的关系

C++继承了所以的C特性
C++在C的基础上提供了更多的语法和特性
C++的设计目标是运行效率和开发效率的统一

2.C到C++的升级

C++更强调语言的实用性,所有的变量都可以在需要使用时定义

int c = 0; 
for(int i=1; i<=3; i++) 
{ 
for(int j=1; j<=3; j++) 
{ 
c += i * j; 
} 

对比:C语言中的变量都必须在作用域开始的位置定义!!
register关键字请求编译器将局部变量存储于寄存器中
C++中依然支持register关键字
C++编译器有自己的优化方式
C语言无法获取register变量的地址
C++中可以取得register变量的地址
C++中的register关键字
C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
在C++中,不允许定义多个同名的全局变量,C++直接拒绝这种二义性的做法。
在C语言中,重复定义多个同名的全局变量是合法的,C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。

2-1.cpp C到C++的升级一

示例程序:
#include <stdio.h>
int g_v;
//int g_v;
int main(int argc, char *argv[])
{
    printf("Begin...\n");
    int c = 0;
    for(int i=1; i<=3; i++)
    {
        for(int j=1; j<=3; j++)
        {
            c += i * j;
        }
    }
    printf("c = %d\n", c);
    register int a = 0;   //register 当代C++编译器已经直接将register删掉
    printf("&a = %p\n", &a);
    printf("End...\n");
    return 0;
}
运行:g++ 2-1.cpp
  ./a.out
运行结果:
36
&a = 0x7fffa321ac48
End...
在.C中运行:
#include <stdio.h>
int g_v;
int g_v; //不报错,C支持定义同名的变量
int main(int argc, char *argv[])
{
    printf("Begin...\n");
    int c = 0;
    for(int i=1; i<=3; i++)  //C不允许在for里面进行定义变量
    {
        for(int j=1; j<=3; j++)  //C不允许在for里面进行定义变量
        {
            c += i * j;
        }
    }
    printf("c = %d\n", c);
    register int a = 0;   
    printf("&a = %p\n", &a);  //C不允许对register取地址
    printf("End...\n");
    return 0;
}

struct关键字的加强
C语言中struct定义了一组变量的集合
C语言中的struct定义的标识符并不是一种新的类型
C++中的struct用于定义一个全新的类型

C和C++中结构体的等价定义

typedef struct _tag_student Student;    	 struct Student
struct _tag_student                  	     {
{                                     			 const char* name;
    const char* name;                   		 int age;
    int age;                           		  };
};

思考:面试中的小问题

int f() 与int f(void)有区别吗?如果有区别是什么?与编译器有关
C编译器:有区别,int f()函数类型返回值为int,参数任意多个,int f(void)函数类型返回值为int,不接受参数
C++编译器:无区别
C++中所有的标识符都必须显示的声明类型
C语言中的默认类型在C++中是不合法的

f(i)
{
    printf("i = %d\n", i);
}
g()
{
    return 5;
}

问题:
1.函数f的返回值和参数分别是什么类型?
C中,未定义默认为int,返回值为int类型,参数为int类型
C++中,错误的
2.函数g可以接受多少个参数?
C中,可以是任意多
C++中,错误的

在C语言中
int f()表示返回值为int,接受任意参数的函数
f(void)表示返回值为int的无参函数
在C++中
int f()和int f(void)具有相同的意义
表示返回值为int的无参函数

2-2.cpp C到C++的升级二

#include <stdio.h>
struct Student
{
    const char* name;
    int age;
};
/*error
f(i)
{
    printf("i = %d\n", i);
}
g()
{
    return 5;
}
*/
int main(int argc, char *argv[])
{
    Student s1 = {"Delphi", 30};
    Student s2 = {"Tang", 30};
    
    f(10);
    
    printf("g() = %d\n", g(1,2,3,4,5));
    
    return 0;
}    

在C中运行:
#include <stdio.h>
typedef struct _tag_student Student;    	 
struct _tag_student                  	 
{                                     	 
    const char* name;                   	
    int age;                           	 
};
f(i)   //int f(int i)
{
    printf("i = %d\n", i);
}
g()   //int g(int i)
{
    return 5;
}
int main(int argc, char *argv[])
{
    Student s1 = {"Delphi", 30};
    Student s2 = {"Tang", 30};
    
    f(10);
    
    printf("g() = %d\n", g(1,2,3,4,5));
    
    return 0;
}  

小结

C++更强调实用性,可以在任意的地方声明变量
C++中的register只是一个兼容的作用
C++编译器能够更好的进行优化
C++中的任意标识符都必须显示的指明类型

猜你喜欢

转载自blog.csdn.net/weixin_42187898/article/details/83107385