您的位置:首页 > 编程语言 > C语言/C++

【C++】基础知识—对C语言的加强

2015-12-02 21:51 531 查看
¥···坚持每天写点东西,感觉很好,既复习基础知识,又可以收获成就感,何乐而不为呢?···¥

  C++语言是在C语言的基础上进行了大量的扩充和改进而得到的。它继承了C语言的全部内容,并在C语言的基础之上增加了面向对象编程的内容,C++既支持新型的面向对象程序设计。因此C++并不是一种新的语言,也不是纯粹的面向对象程序设计语言。

  C++首先保持了语言的简洁、高校和汇编语言等优点,同时又给语言的不足和问题做了许多改进。

一、实用性增强

1. 在C语言中变量都必须在作用域开始的位置定义

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{
int i = 0;

printf("hello... \n");

int k;

system("pause");
}
结果是:


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

#include <iostream>
using namespace std;

int main()
{
int i = 0;
printf("hello....\n");

cout << "测试c++" << endl;
int k;      // 只会提示未引用的变量,不会报错

system("pause");
return 0;
}
二、变量检测增强

1. 在C语言中,重复定义多个同名的全局变量是合法的

    在C++中,不允许定义多个同名的全局变量

    C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上

2. 

三、struct类型增强

1. struct类型的加强:

 C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Teacher
{
int age;
char name[12];
};

void main()
{
int i = 0;
// c++
Teacher t1;   //  struct Teacher t1;(C语言)
t1.age = 22;
printf("hello....\n");
}


四、C++所有的变量和函数都必须有类型

 在C语言中

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


例子:

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

}

second()
{
return 5;
}

int main(int argc, char *argv[])
{

first(10);

printf("second() = %d\n", second(1, 2, 3, 4, 5));

getchar();
return 0;
}
考虑函数first()的返回值是什么类型,参数又是什么类型? 函数second()可以接受多少个参数?

C++更加强调类型,任意的程序元素都必须显示指明类型

五、新增Bool类型关键字

 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

#include <iostream>
using namespace std;

void main()
{
bool b1 = true;  // 告诉c++编译器给我分配 1个字节的内存

bool b2, b3, b4, b5;

cout<<"sizeof(bool) "<<sizeof(bool)<<endl;

// bool变量 1 或者 0
b1 = 10;
cout<< "bl: " << b1 << endl;
b1 = -10;
cout<< "bl:" << b1 << endl;

// bool变量 1 或者 0
b1 = 0;
cout<< "bl:" << b1<< endl;

cout<< "hello..." << endl;
system("pause");
return ;
}
六、三目运算符差异

1. C语言是返回变量的值, C++语言是返回变量本身;C语言中的三目运算符返回的是变量值,不能作为左值使用

#include <stdio.h>
#include <string.h>

// aaa.c
void main()
{
int a = 10;
int b = 20;

int var = 100;
var = 103;

// (a < b ? a : b) = 30;
*(a < b ? &a : &b) = 30;  //* 指向运算符:根据xx的地址值找到对应的存储空间

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

}


2. C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方(本身就是内存地址的值)

3. C语言如何支持类似C++的特性呢?

=>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已

七、const用法差异

1. 初级理解:const是定义常量==》const意味着只读

void main()
{
// 代表一个常整形数
const int a;
int const b;

// c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
const int *c;

// 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
int * const d;
// 一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
const int * const e;

system("pause");
return ;

}


Const好处

// 合理的利用const,

// 1指针做函数参数,可以有效的提高代码可读性,减少bug;

// 2清楚的分清参数的输入和输出特性
2. C语言中的冒牌货

#include <stdio.h>
#include <string.h>

void main()
{
//好像 a 是一个常量
const int a = 10;

int *p = NULL;
p = (int *)&a; // p指向a的内存地址

*p = 20;  // 间接赋值

printf("a:%d \n", a);
printf("*p:%d \n", *p);
}
输出结果是:a20  *p20

对比C++:

1. C++编译器对const常量的处理: 当碰见常量声明时,在符号表中放入常量 =

2. 问题:那有如何解释取地址:编译过程中若发现使用常量则直接以符号表中的值替换;
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)

3. C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在const修饰的常量编译期间,就已经确定下来了。



结论:

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

C++中的const常量   :

 1)可能分配存储空间,也可能不分配存储空间  

 2)当const常量为全局,并且需要在其它文件中使用,会分配存储空间

 3) 当使用&操作符,取const常量的地址时,会分配存储空间

 4) 当const int &a = 10; const修饰引用时,也会分配存储空间(关于引用的知识下一章节会介绍)

 5)const常量是由编译器处理的,提供类型检查和作用域检查:宏定义由预处理器处理,单纯的文本替换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息