发布时间:2023-02-28 文章分类:电脑基础 投稿人:樱花 字号: 默认 | | 超大 打印

前言

在学习了C语言的基础上,C++到底和C有什么区别呢?

1.1 第一个C++程序

#include <iostream>
// 使用名为std的命名空间
using namespace std;
int main()
{
    // printf ("hello world\n");
    // cout 标准输出  往屏幕打印内容  相当于C语言的 printf
    // << 左移操作符,在这里它的功能被改造,代表数据流向
    // << 代表数据从右端移到左端 右端是 "hello world"字符串,左端是 cout 标准输出
    // 所以 cout << "hello world" 代表将内容打印到标准输出
    // endl 代表换行,相当于 C语言的 '\n'
    // << 操作符可以连着使用
    cout << "Hello World!" << endl;
    return 0;
}

运行结果:
C++回顾(一)——从C到C++

1.2 命名空间

1.2.1 为什么引入命名空间

1.2.2 怎么使用命名空间

(1)命名空间的定义

namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:

namespace name {
    变量
    函数
    类
}

name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围

例如:
定义一个命名空间,名字叫NameSpaceA

namespace NameSpaceA
{
    int a = 0;
}

命名空间的定义可以嵌套,例如:

namespace NameSpaceB
{
    int a = 1;
    namespace NameSpaceC
    {
        struct Teacher
        {
            char name[10];
            int age;
        };
    }
}

(2)命名空间的使用

NameSpaceA::a = 10;   // 使用命名空间 NameSpaceA中的变量a
NameSpaceB::a = 20;   // 使用命名空间 NameSpaceB中的变量a
printf ("%d, %d\n", NameSpaceA::a, NameSpaceB::a);

使用命名空间B中的命名空间C中的结构体 Teacher

NameSpaceB::NameSpaceC::Teacher t2 = {"xiaoming", 20};
using NameSpaceA::a;
a = 20;                // 使用命名空间NameSpaceA中的a
NameSpaceB::a = 30;    // 使用命名空间NameSpaceB中的a

using 声明不仅可以针对命名空间中的变量或者函数,还可以对整个命名空间进行声明,这样的方式声明命名空间以后,在后面使用未指定具体命名空间的变量或者函数产生命名冲突的时候,默认使用 NameSpaceB中的变量和函数。

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

示例代码:

#include <iostream>
namespace A
{
	int a = 1;
	void print()
	{
		std::cout << "this is namespace A" << std::endl;     //::作用域限定符
	}
}
namespace B
{
	int a = 2;
	void print()
	{
		std::cout << "this is namespace B" << std::endl;
	}
}
int main()
{
	//std::cout << a << std::endl;   //a不是全局变量也不是main函数局部变量 所以未定义
	std::cout << A::a << std::endl;
	using namespace B;
	std::cout << a << std::endl;
	print();
	A::print();
	//using namespace A;// 这里如果不注释掉,编译不通过
	print();
	return 0;	
}

C++回顾(一)——从C到C++

1.3 register关键字的变化

#include <stdio.h>
int main()
{
	register int i = 0;    //声明寄存器变量 不能取地址
	for (i = 0; i < 1000; i++);
	&i;     //C++  对寄存器变量取地址 register 关键字变得无效
	return 0;
}

1.4 变量检测加强

#include <stdio.h>
// 在C语言中重复定义多个全局变量是合法的
// 这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上
int g_a;
int g_a = 1;
int main()
{
    printf ("%d\n", g_a);
    printf ("%p\n", &g_a);
    return 0;
}

1.5 struct类型加强

#include <stdio.h>
struct Student
{
    char name[20];
    int age;
};
int main()
{
    // C语言中 struct 定义了一组数据的集合,而不是一种新的数据类型
    // 所以在定义变量的时候需要在前面加上 struct 关键字进行修饰
    // C++中 struct 定义了一种新的数据类型,可以直接用来定义变量
    Student stu1 = {"xiaoming", 10};
    return 0;
}

1.6 C++中所有变量和函数都必须要有类型

1.6.1 C语言中函数的一些不好的使用方式

#include <stdio.h>
// 1 函数可以没有返回参数类型
f()
{
    printf ("hello world\n");
}
// 2 函数参数可以没有数据类型
g(i)
{
    return i;
}
int main()
{
    // 3 没有参数的函数可以接收任意个参数
    f(1,2,3,4,5);
    g(12,15);
    return 0;
}

1.6.2 C++中的加强

1.7 新增bool类型关键字

#include <iostream>
using namespace std;
int main()
{
    bool a = true;
    bool b = false;
    a = 100;
    cout << a << endl;// 输出1
    cout << b << endl;// 输出0
    return 0;
}

1.8 三目运算符的增强

#include <stdio.h>
// C语言中表达式的结果 放在什么地方? ==> 寄存器
// 1
// 表达式返回的是一个值,是一个数
// 在C++中,表达式返回的是变量本身
// 2 如何做到的
// 让表达式返回一个内存空间..内存的首地址 指针
// 在C语言中如何实现C++的效果
// 3 本质
// C++编译器自己做了取地址的操作
int main()
{
    int a = 10;
    int b = 20;
    // C++中三目运算符返回的是变量本身,所以可以作为左值使用
    // 这里C语言会报错(20 = 10),c++可以(b = 100)
    (a > b ? a : b) = 90; 
    // 在C语言中让三目运算符可以当左值使用,可以通过返回变量地址实现
    *(a > b ? &a : &b) = 90;
    printf ("%d, %d\n", a, b);
    return 0;
}