栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

C++对C语言的增强

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++对C语言的增强

全局变量的检测增强

C语言中定义两个同名变量能够编译通过

int a;
int a = 10;

C++中不能编译通过

c++.cpp:5:5: 错误:‘int a’ 重定义
 int a = 10;
     ^
c++.cpp:4:5: 附注:‘int a’ previously declared here
 int a;
     ^
函数检测增强: 参数类型,返回值,函数调用参数个数

C语言中能够编译通过

//函数检测增强
int getRectS(w, h)
{
}
void test01()
{
    getRectS(10, 10, 10);
}
类型转换检测增强
void test02()
{
    char * p = malloc(sizeof(64)); // malloc返回值是void *
}

在C++中必须加上强转

// 类型转换检测增强
void test02()
{
    char * p = (char *)malloc(sizeof(64)); // malloc返回值是void *
}
struct 增强
//struct 增强
struct Person
{
    int m_Age;
    // int plusAge(); C语言中struct不能加函数,C++可以
};
void test04()
{
    struct Person p; // C语言必须加上struct关键字
}
bool增强

C语言中bool值需要include 头文件

三目运算符增强
//三目运算符增强
void test05()
{
    int a = 10;
    int b = 20;
    cout << (a > b ? a : b) << endl;
    (a > b ? a : b) = 100;
    cout << b << endl;  //  100 , c语言中返回的是值,c++中返回的是变量
    //c中可以这样写 *(a > b ? &a : &b) = 100;
}
const增强

c语言中const修饰的全局变量不可以修改,const修饰的局部变量可以用指针间接修改,是伪常量,不可以初始化数组,编译器是会分配内存的

//const增强
const int m_A = 100; //全局的不可以修改
void test07()
{
    const int m_B = 20;
    int *p = &m_B;
    *p = 200;
    printf("*p = %d, m_B = %dn",*p, m_B);  //200, 200

    // int array[m_B];  伪常量,不可以初始化数组
}

c++中const修饰的局部变量是真常量,可以初始化数组,*是在符号表里,不会分配内存,取地址时,编译器会临时开辟一块内存空间,p指向的是临时的空间

//const增强
const int m_A = 100; //全局的不可以修改
void test07()
{
    const int m_B = 20;
    int *p = (int*)&m_B;
    *p = 200;
    cout << " *p = " << *p << " m_B = " << m_B << endl;  // 200, 20
    int array[m_B];  //真常量,可以初始化数组
}

c语言const默认是外部链接,别的文件可以直接使用
c++中cosnt默认是内部链接,要想在其他文件使用,在const前应加上extern提高作用域

const分配内存的情况

分配内存时就可以间接修改(下面第二点除外,因为分配在全局data区)

  • const修饰局部变量,不分配内存,在符号表里,取地址分配临时内存
  • extern const int a;extern也会分配内存
  • 用变量初始化const变量,会分配内存,可以指针间接修改
  • 用自定义数据类型 也会分配内存
尽量用const来代替define

在c语言中,如果要定义一个常量,必须使用预处理器:

#define MAX 1024

首先,我们定义的MAX从未被编译器看到,因为在预处理阶段,所有的MAX就已经被替换为了1024,这使得定位问题出现困难。
解决办法就是用一个常量替换:

const int max = 1024;

const和#define区别总结:

  • const有类型,可进行编译器类型安全检查,#define没有类型,不能进行安全检查
  • const有作用域,而#define不重视作用域,如果需要定义在一段作用域内有效的常量,则#define不能使用。(#define默认定义处到文件结尾,也可以卸载宏常量)
#define MAX 1024
#undef MAX

宏常量没有命名空间

namespace DEF
{
    #define A 97
}
int main()
{
    // cout << DEF::A << endl; 错误
    cout << A << endl;
    // int A = 100; 命名冲突
    return 0;
}
转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038612.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号