iostream文件
- iostream中的io指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。
- c++的输入、输出方案涉及iostream文件中的多个定义。比如用来输出信息的cout就在其中。
头文件名的区别
-
C语言
C语言的传统是头文件使用扩展名 h,将其作为一种通过名称标识文件类型的简单方式。例如 math.h支持一些数学函数。 -
C++
C++头文件没有扩展名。
有些C头文件被转换成C++头文件,这些文件被重新命名,去掉了扩展名h,并在文件名称前面加上前缀c(表示来自C语言) -
名称空间namespace
如果使用的是iostream,而不是iostream.h,则应使用名称空间编译指令来使iostream中的定义对程序可用,即
using namespace std;
有了这句using编译指令,才能使用cout、cin等,或者用第二种方式:
using std::cout;
using std::cin;
using std::endl;
封装性:
创建一个头文件 aa.h
里面编写 :
#pragma once
namespace aa
{
typedef int INT;
typename char CHAR;
};
然后在cpp文件中引入该头文件,但我们却无法使用之前写好的东西。
#include "aa.h"
//无法引用 INT a = 10
;
INT a
会报错,因为我们只引入了头文件,没有使用里面的名称空间。
需要再加入:
using namespace AA
;或者using AA::INT
;
指针和数组名的区别
(指针是变量,数组名是一个地址常量)
#include<iostream
using namespace std;
int main(void)
{
int a = 10;
int* p = &a;
int arr[] = { 0,1,2,3,4 };
//这里定义了一个指针p和一个数组arr。
cout << p << endl;
cout << arr << endl;
//运行结果都是地址
return 0;
}
输出
反汇编:
cout << p << endl;
cout << arr << endl;
1. 在输出指针时,需要先从p里面取出四字节,再放到寄存器里push;
2.在输出arr时,直接把arr放到寄存器里再push。
解引用
:
指针的解引用的值是变量的地址:
原理:
int a = 10;
008F1B02 mov dword ptr [a],0Ah //10 赋值给a
int* p = &a;
008F1B09 lea eax,[a] //a的地址放入寄存器
008F1B0C mov dword ptr [p],eax //p中的四个字节 存放a的地址
*p = 20;
008F1B0F mov eax,dword ptr [p]
008F1B12 mov dword ptr [eax],14h //20给寄存器,完成对a的改变
1.解引用,就是把值从地址中取出来。
int main(void)
{
int a = 10, b = 20;
int* p = &a;
b = *p;
return 0;
}
int a = 10, b = 20;
00F81B02 mov dword ptr [a],0Ah
00F81B09 mov dword ptr [b],14h
int* p = &a;
00F81B10 lea eax,[a] a的地址 放入eax
00F81B13 mov dword ptr [p],eax p取四字节存入eax中的四字节
b = *p;
00F81B16 mov eax,dword ptr [p] p里取四字节放入寄存器
00F81B19 mov ecx,dword ptr [eax] 从eax取出四字节放入ecx
00F81B1B mov dword ptr [b],ecx 再从ecx中内容给变量b的四字节
2.解引用就是从地址中取值。
从 b = *p
,可以看出,用一个变量往另外一个变量中赋值,也是解引用
int a = 10;
00F80FD8 mov dword ptr [a],0Ah
int b;
b = a;
00F80FDF mov eax,dword ptr [a]
00F80FE2 mov dword ptr [b],eax
可以得出: 解引用就是去地址中取值。
C语言和C++中const的区别:
int main()
{
const int a = 10;
int b = 20; //常量赋值
b =a; //常变量赋值
}
const int a = 10;
00311825 mov dword ptr [a],0Ah
int b = 20;
0031182C mov dword ptr [b],14h //20直接给b
b = a;
00311833 mov eax,dword ptr [a] 先将a的值放入寄存器,
00311836 mov dword ptr [b],eax b再从寄存器中取值
#include<stdio.h>
int main(void)
{
const int a = 10;
int b;
b = a;
int* p = &a; //指针可以改变 a的值,而c++中不行
*p = 100;
return 0;
}
指针可以改变 a的值,而c++中不行
在C++中,const修饰的变量就是常量,和常量一模一样
在编译阶段会直接将常量的值替换掉常量的使用点。
C语言反汇编:
int main(void)
{
const int a = 10;
int b, c;
b = 16;
c = a;
return 0;
}
const int a = 10;
00101828 mov dword ptr [a],0Ah
int b, c;
b = 16;
0010182F mov dword ptr [b],10h
c = a;
00101836 mov eax,dword ptr [a] //在c语言中a还是变量
00101839 mov dword ptr [c],eax
c++反汇编
const int a = 10;
003E1828 mov dword ptr [a],0Ah
int b, c;
b = 16;
003E182F mov dword ptr [b],10h
c = a;
003E1836 mov dword ptr [c],0Ah //在C++中a已经被替换成常量
1.const修饰的变量,必须初始化,因为在编译阶段,会被替换成常量,如果不初始化,后面将没有机会对其赋值
2.如果变量对const修饰的变量赋值,则回退化成常变量。
C语言面向过程的语言。
效率高,不需要实例化
如洗衣服: 放衣服–>加洗衣粉–>加水—>漂洗---->清洗----->甩干
C++面向对象的语言
:易扩展。易维护,有封装,继承,和多态的特点。可以设计出高内聚和低耦合的系统
new 出一个人和洗衣机:
”人“ 加入属性和方法:放衣服(方法)、加洗衣粉(方法)、加水(方法)
”洗衣机“ 加入属性和方法:漂洗(方法)、清洗(方法)、甩干(方法)
然后执行:
人.放衣服(方法)-> 人.加洗衣粉(方法)-> 人.加水(方法)-> 洗衣机.漂洗(方法)-> 洗衣机.清洗(方法)-> 洗衣机.甩干(方法)