马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zzxwbs 于 2017-6-8 23:50 编辑
学习一门新语言,总是要从hello world开始,但是还有更基础的东西
比如c++文件一般是什么格式,常见的格式一般都是.cpp,当然除此之外可能还有.c、.cc、.c++,以防你遇到时一脸懵逼(比如我)
c++的hello world程序是这样的#include <iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;
}
和c不一样的地方好像有三处,
1.头文件
2.头文件下面多了一行
3.输出函数好像不一样
除此之外好像和c没啥不同
1.c++头文件
1.1标准的c++头文件
和c不同,一个标准的c++头文件,是没有.h的,比如#include <iostream>
#include <string>
#include <list>
1.2标准的c语言头文件
那我想引用c语言头文件,需要改动吗?
要改,想要用标准c语言头文件,不能只是单纯的#include <stdio.h>
如何改动先看例子#include <stdio.h> ----> #include <cstdio>
#include <time.h> ----> #include <ctime>
#include <string.h> ----> #include <cstring>
规律好像就是把.h去掉了,前面加了个c,总结起来就是“去尾加头”
当然有时候如果你忘了改,会发现编译依旧可以通过,这可能是编译器帮你自动处理了
1.3系统c的头文件(拓展)
什么是系统c的头文件?除了标准c以外的一些c开发常用的头文件
常见于linux开发,比如进程间通信,信号处理,线程,TCP/UDP,例如#include<unistd.h>
#include<pthread.h>
1.4用户自定义头文件
如果自己写头文件的时候带.h,那么导入的时候就要带.h
2.输入输出函数
cout(console out控制台输出),<<右边的内容可以向左边通过cout输出,并且<<可以连续使用,例如cout << "fish" << "c"<<endl;
endl的意思就是本行结束,相当于c语言中的\n换行
那么cin的意思大家猜一猜也就知道了,console in,控制台输入,和scanf功能一致,那么具体怎么用呢,先看例子#include <iostream>
using namespace std;
int main()
{
int age=0;
cout << "请输入你的年龄:" << endl;
cin >> age;
cout << "你的年龄是:" << age << "岁" << endl;
}
咦,为什么age不用取地址呢,scanf中不都是要&age才能存数据吗?
这是因为c++ 中的输入输出会自动识别格式,无需取地址
3.编译器(拓展)
对于在linux平台上开发来说,编译链接往往都是手动的
c语言编译链接用的是gcc,c++程序编译用的是g++
编译选项和gcc基本相同,例如-o -On -E -S -c -l -L -I -g
那么我非要用gcc编译可以吗,可以, 但是编译时需要添加一个链接库
例如gcc ***.cpp -lstdc++
4.命名空间
4.1概念
把一组逻辑相关的变量、函数、类型等组织到一起的一个逻辑结构。
4.2作用
便于分工和划分模块,避免命名冲突
上面两句话看完是不是一脸懵逼,WTF
好吧,我再用通俗的说法解释一遍,一个大程序中,需要定义很多的函数和变量,还不能重名,所以如何命名就成了难题,为了解决这个问题,就出现了命名空间,别急,说完语法,举几个例子你就明白了
4.3语法
namespace 空间名
{
/* 定义 声明 变量 和 函数 定义类型 */
}
命名空间可以分开,多个同名的命名空间逻辑上是一个
4.4举例
先从最简单的例子开始,一点点增加难度#include <iostream>
using namespace std;
namespace fishc1
{
int age=20;
}
namespace fishc2
{
int age=25;
}
int main()
{
}
fishc1和fishc2都定义了一个同名变量age,编译可以完全通过
那么什么叫命名空间可以分开呢,比如#include <iostream>
using namespace std;
namespace fishc1
{
void print();
}
namespace fishc1
{
void print()
{
cout << "hello world"<< endl;
}
}
int main()
{
}
4.5如何使用命名空间中的数据
4.5.1在数据前面加"命名空间::",举例#include <iostream>
using namespace std;
namespace fishc1
{
int age=20;
}
namespace fishc2
{
int age=25;
}
int main()
{
cout << fishc1::age << endl;
cout << fishc2::age << endl;
fishc1::age = 25;
fishc2::age = 20;
cout << fishc1::age << endl;
cout << fishc2::age << endl;
}
4.5.2使用using声明
4.5.2.1using 空间名::数据名;
当某个数据使用频率极高,或者不想每次都在名字前加命名空间,那么就可以使用声明,这样里面的数据名就可以直接使用,例如#include <iostream>
using namespace std;
namespace fishc1
{
int age=20;
}
namespace fishc2
{
int age=25;
}
using fishc1::age;
int main()
{
cout << age << endl;
cout << fishc2::age << endl;
age = 25;
fishc2::age = 20;
cout << age << endl;
cout << fishc2::age << endl;
}
4.5.2.2using namespace 空间名;
如果整个命名空间都想直接使用,就声明整个命名空间,例如#include <iostream>
using namespace std;
namespace fishc
{
int age1=20;
int age2=25;
}
using namespace fishc;
int main()
{
cout << age1 << endl;
cout << age2 << endl;
age1 = 25;
age2 = 20;
cout << age1 << endl;
cout << age2 << endl;
}
说到这里,细心的人可能发现,第二行的using namespace std;好像就是这种用法,那么开头那个程序也可以这样写#include <iostream>
int main()
{
std::cout << "hello world!" << std::endl;
}
4.6命名空间的嵌套namespace ns1
{
namespace ns2
{
namespace ns3
{
show();
}
}
}
使用show函数就是ns1::ns2::ns3::show();
4.7命名空间重命名
namespace ns4 = ns1::ns2::ns3;
现在再调用show函数就可以ns4::show();
这个看看就知道什么意思了吧
4.8无名命名空间
4.8.1概念
一个数据如果没有定义在任何命名空间中,则这个数据属于无名命名空间
还有一种显式的无名命名空间,例如#include <iostream>
using namespace std;
int age1 = 20;
/* 相当于static的效果,不能跨文件访问 */
namespace
{
int age2 = 25;
}
int main()
{
cout << age1 << endl;
cout << ::age1 << endl;
cout << age2 << endl;
cout << ::age2 << endl;
}
#include <iostream>
using namespace std;
int var = 100;
namespace ns
{
int var = 200;
void fun(void)
{
cout << ns::var << ' ' << ::var << endl;//200 100
}
}
using namespace ns;
cout << var << endl;//错误
cout << ns::var << ' ' << ::var << endl;//200 100
using ns::var;
cout << var << ' ' << ::var << endl;//200 100
总结:
1.头文件的不同
2.基本的输入输出
3.命名空间
下期预告:c++中的数据类型,函数,函数重载,哑元函数参数,函数参数的默认值和内联函数 |