C++数据类型
几个概念
命名空间是C++标准库引入的,其中命名空间可以解决变量冲突问题,当出现局部变量和全局变量同名的时候, 局部变量优先被访问.同时命名空间的格式如同一下代码
namespace name1
{
int a = 0;
}namespace name2
{
int a = 2;
}
注意C++中的所有组件都是在一个叫做std的命名空间中被定义.这里来看两段代码
//代码1
#include <iostream>
using namespace std;namespace name1
{
int a = 0;
}namespace name2
{
int a = 2;
}int main()
{cout<<"exexpected name1::a = 0, actual name1::a = "<<name1::a<<endl;cout<<"exexpected name2::a = 2, actual name2::a = "<<name2::a<<endl;name1::a = 3;name2::a = 4;cout<<"exexpected name1::a = 3, actual name1::a = "<<name1::a<<endl;cout<<"exexpected name2::a = 2, actual name2::a = "<<name2::a<<endl;return 0;
}
//代码2
#include <iostream>namespace name1
{
int a = 0;
}namespace name2
{
int a = 2;
}int main()
{std::cout<<"exexpected name1::a = 0, actual name1::a = "<<name1::a<<std::endl;std::cout<<"exexpected name2::a = 2, actual name2::a = "<<name2::a<<std::endl;name1::a = 3;name2::a = 4;std::cout<<"exexpected name1::a = 3, actual name1::a = "<<name1::a<<std::endl;std::cout<<"exexpected name2::a = 2, actual name2::a = "<<name2::a<<std::endl;return 0;
}
上面两端代码中唯一的区别就是代码1在第二行加入和using namespace std;而代码2没有这一行,而在cout以及endl前面加了一个std::,也许到这里大家心里就会有个疑惑,那就是此处的std和::是什么,接下来就来探讨一下这个std,::分别代表的什么含义
几个重要基本概念
:: 作用域解释符
来看一段代码
namespace std//C++的标准库命名空间
{
}
输入输出对比
来看一段代码
int main()
{int i2 = 1;double d2 = 2.22;cout<<"int -> "<<i2<<", double -> "<<d2<<endl;cout<<"please input int and double:"<<endl;cin>>i2>>d2;cout<<"================\n";cout<<"int -> "<<i2<<", double -> "<<d2<<endl;return 0;
}
在C++中输入输出对应的是cin,cout,其中cout 是标准输出对象,cin是标准输入对象,而其中<<是输出操作符,意思就是将<<后面的内容输出到控制台中,而>>是输入操作符,意思是从标准输入中输入的内容流向>>后面的变量中,endl是一个换行操作符,它们都属于C++的标准库.
缺省参数
//全缺省
int Add1(int a = 0, int b = 0)
//版缺省
int Add2(int a, int b = 0)
//注意缺省参数在缺省的过程中必须从右往左缺省,不能从左往右缺省
指针和引用
引用
引用不是定义一个新的变量,它不会给变量开辟新的空间,而是给变量重新起了一个名字.其中应用有很多的特点
1.一个变量可以有多个别名,这就像一个人有一个大名,但是可以有多个小名
2.引用必须初始化
3.引用只能在初始化的时候引用一次,不能改变让其引用其他变量
注意事项
应用在使用的时候只能缩小其范围不能增大其范围,也就是说对一个可读可写的变量可以起一个别名是const类型的,但是对一个只读变量不能给其起一个可读可写的变量
引用做参数的交换函数
void Swap(int& left, int& right)
{int tmp = left;left = right;right = tmp;
}
交换函数有三个版本,一个是值交换,一个是值交换一个是地址交换,另一个是引用交换,其中值交换交换的只是两个临时变量,与实参没有关系,而地址交换交换的是对应的地址所存放的变量的值,引用交换交换的是两个变量的别名,也相当于交换了两个实参
几个注意事项
1.不要返回一个临时变量的引用
2.如果返回对象出了当前函数的作用域之后仍然存在,则返回引用,因为引用更加高效
一个指针占多少字节
在32位程序下一个指针占4个字节,在64位程序下一个指针占8分字节.但是看到这里可能就有人会问为什么在不同程序下一个指针占的字节不同呢.原因是在3位程序下进程的虚拟地址空间总共是4G,而所谓的指针也就是地址,操作系统为了将这么多的地址高效的管理,它就将这些虚拟地址空间进行一个一个的编号,而32位程序对应的地址范围是4G,要对这4G的内存进行编号就必须使用4个字节才能将其一个一个的进行有效的编号.同理在64位程序下进程的虚拟地址空间有8G的地址空间要对这8G的虚拟地址空间进行编号就必须使用8个字节将其有效的编号.所以看到这里大家应该明白了为什么在32位程序下指针占4个字节,而在64位程序下指针占8个字节了吧.
指针和引用的几个区别
1.指针可以出尔反尔,但是引用只能从一而终
2.引用必须针对一个有效的变量,但是指针它是可以为空的
3.sizeof对应的引用是指的是引用的这个变量的大小是多少,但是sizeof指针对应的大小在不同的程序下对应的大小是固定的(关于sizeof(指针)上面已经说明在此就不再叙述了)
4.指针的++和引用的++不一样,指针的++对应的是加一个指针类型的大小,而引用的++对应的是给这个变量++
5.相比而下,引用比指针会更加安全一点.