Noname's Blog
信息安全专业的小萌新,立志走上更大的舞台
C++对C语言的一些扩展

C++对C语言的一些扩展

namespace

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

关于和<iostream.h>格式不一样,二者是两个代码不一样的文件,且c++标准已经明确提出不支持了后缀为.h的头文件
1.使用iostream.h时,相当于在c中调用库函数,使用的是全局命名空间
2.当使用iostream时,该头文件没有定义全局命名空间,必须使用namespace std才能正确使用cout

C++命名空间定义及使用语法

1.using namespace std
2.显式引入std

void main()
{
    std::cout << "namespace test" <<std::endl;
    system("pause");
}

定义
namespace name{};
using namespace name;

namespace namespaceA
{
    int a = 20;
}
//可嵌套
namespace namespaceB
{
    namespace namespaceC
    {
        struct C
        {
            char name[64];
            int age;
        }
    }
}

void main()
{
    using namespace namespaceA;
    using namespace namespaceB;
    cout << namespaceA::a << endl;
    
    //显示写全
    //namespaceB::namespaceC::Person p;
    //p.age = 18;
    
    //先using
    using namespaceB::namespaceC::Person;
    
    Person p1;
    p1.age = 18;
    
    system("pause");
}

几个增强

变量

C语言中的变量必须在作用域开始的时候定义,C++中所有变量可以在需要使用时再定义,如下列代码,在c中不可通过编译

int main()
{
    int i = 0;
    printf("hello...");
    int k;
    system("pause");
    return 0;
}

register增强

register 请求编译器让变量直接放在寄存器里面,使得速度快
在C语言中,register修是的变量不能取地址
在C++中,不适用register也坐了优化,且可以取得register变量的地址

int main()
{
    register int a = 0;
    
    printf("&a=%d\n", &a);
    
    for(int i=0;i < 1000;i++)
    {
        printf(i);//优化,将i放入寄存器
    }
    
    system("pause");
    
}

变量检测增强

在C语言中,重复定义多个同名的全局变量时合法(多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上)
在C++中,不允许定义多个同名的全局变量

int a;
int a=1;

int main()
{
    printf("a=%d", a);//C语言中允许,且输出1
    return 0;
}

上述在C++中不通过编译

struct类型加强

在C++中的struct时一个新类型的定义声明

struct Student
{
    char name[10];
    int age;
}
int main()
{
    Student s1 = {"c", 18};//直接当成一个类型使用
}

C++中所有的变量和函数都必须有类型
在C中的几个魔鬼现象

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

g()
{
    return 5;
}

int main()
{
    f(20);
    printf("g()=%d\n", g(1,2,3,4,5));
}

return 0;

C语言中的默认类型在C++中不合法,所有的变量和函数都必须有类型

新增Bool类型关键字

bool占用一个字节
true代表真值,编译器内部用1表示
false代表假值,编译器内部用0表示
C++编译器会在赋值时将非0值转换为true,0值转换为false

#include "iostream"
using namespace std;

int main()
{
	int a;
	bool b = true;
	printf("b=%d, sizeof(b)=%d\n", b, sizeof(b));//b=1,sizeof=1

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

	b = -4;
	a = b;
	printf("a=%d, b=%d\n", a, b);//a=1,b=1

	system("pause");
}

三目运算符

在C语言中三目运算符是一个表达式,表达式不能做左值
在C++中可以进行这样的赋值

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


const

引用

引用是C++的概念

引用作函数参数

普通引用在声明时必须用其它的变量进行初始化
引用作为函数参数声明时不进行初始化

当函数返回值为引用时:
若返回栈变量
不能称为其他引用的初始值
不能作为左值使用
若返回静态变量或全局变量
可以成为其他引用的初始值
即可以作为右值、左值使用

const

基本内容:

const int a;
int const b;//二者一样

const int *c;//const修饰的是指针所指向的内存空间,不能被修改
int * const d;//d指向的空间不能被修改
const int * const e;//指向的空间和本身都不能被修改
const int *p = a;

常量指针,指针的指向可以改,指针指向的值不可以改

int const *p;

指针常量,指针的指向不可以改。

c语言中的假象

int main()
{
    const int a = 10;
    
    int *p= null;
    p = (int *)&a;
    *p = 20;
    
    printf("a=%d\n", a);//20
}

关于函数

暂时决定在另一篇里说吧。。