鱼C论坛

 找回密码
 立即注册
查看: 3317|回复: 3

[技术交流] 不是从零开始的c++学习笔记(001)——第一个c++程序

[复制链接]
发表于 2017-6-8 16:04:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zzxwbs 于 2017-6-8 23:50 编辑

学习一门新语言,总是要从hello world开始,但是还有更基础的东西
比如c++文件一般是什么格式,常见的格式一般都是.cpp,当然除此之外可能还有.c、.cc、.c++,以防你遇到时一脸懵逼(比如我)
c++的hello world程序是这样的
  1. #include <iostream>
  2. using namespace std;

  3. int main()
  4. {
  5.         cout << "hello world!" << endl;
  6. }
复制代码


和c不一样的地方好像有三处,
1.头文件
2.头文件下面多了一行
3.输出函数好像不一样
除此之外好像和c没啥不同

1.c++头文件

1.1标准的c++头文件
和c不同,一个标准的c++头文件,是没有.h的,比如
  1. #include <iostream>
  2. #include <string>
  3. #include <list>
复制代码


1.2标准的c语言头文件
那我想引用c语言头文件,需要改动吗?
要改,想要用标准c语言头文件,不能只是单纯的#include <stdio.h>
如何改动先看例子
  1. #include <stdio.h>  ----> #include <cstdio>
  2. #include <time.h>   ----> #include <ctime>
  3. #include <string.h> ----> #include <cstring>
复制代码

规律好像就是把.h去掉了,前面加了个c,总结起来就是“去尾加头”
当然有时候如果你忘了改,会发现编译依旧可以通过,这可能是编译器帮你自动处理了

1.3系统c的头文件(拓展)
什么是系统c的头文件?除了标准c以外的一些c开发常用的头文件
常见于linux开发,比如进程间通信,信号处理,线程,TCP/UDP,例如
  1. #include<unistd.h>
  2. #include<pthread.h>
复制代码


1.4用户自定义头文件
如果自己写头文件的时候带.h,那么导入的时候就要带.h

2.输入输出函数

cout(console out控制台输出),<<右边的内容可以向左边通过cout输出,并且<<可以连续使用,例如
  1. cout << "fish" << "c"<<endl;
复制代码

endl的意思就是本行结束,相当于c语言中的\n换行
那么cin的意思大家猜一猜也就知道了,console in,控制台输入,和scanf功能一致,那么具体怎么用呢,先看例子
  1. #include <iostream>
  2. using namespace std;

  3. int main()
  4. {
  5.     int  age=0;
  6.         cout << "请输入你的年龄:" << endl;         
  7.         cin >> age;
  8.         cout << "你的年龄是:" << age << "岁" << endl;
  9. }
复制代码

咦,为什么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举例
先从最简单的例子开始,一点点增加难度
  1. #include <iostream>
  2. using namespace std;
  3. namespace fishc1
  4. {
  5.     int age=20;
  6. }
  7. namespace fishc2
  8. {
  9.     int age=25;
  10. }
  11. int main()
  12. {

  13. }
复制代码

fishc1和fishc2都定义了一个同名变量age,编译可以完全通过

那么什么叫命名空间可以分开呢,比如
  1. #include <iostream>
  2. using namespace std;
  3. namespace fishc1
  4. {
  5.     void print();
  6. }
  7. namespace fishc1
  8. {
  9.     void print()
  10.     {
  11.         cout << "hello world"<< endl;
  12.     }
  13. }
  14. int main()
  15. {

  16. }
复制代码


4.5如何使用命名空间中的数据

4.5.1在数据前面加"命名空间::",举例
  1. #include <iostream>
  2. using namespace std;
  3. namespace fishc1
  4. {
  5.     int age=20;
  6. }
  7. namespace fishc2
  8. {
  9.     int age=25;
  10. }
  11. int main()
  12. {
  13.     cout << fishc1::age << endl;
  14.     cout << fishc2::age << endl;
  15.     fishc1::age = 25;
  16.     fishc2::age = 20;
  17.     cout << fishc1::age << endl;
  18.     cout << fishc2::age << endl;
  19. }
复制代码

4.5.2使用using声明

4.5.2.1using 空间名::数据名;
当某个数据使用频率极高,或者不想每次都在名字前加命名空间,那么就可以使用声明,这样里面的数据名就可以直接使用,例如
  1. #include <iostream>
  2. using namespace std;
  3. namespace fishc1
  4. {
  5.     int age=20;
  6. }
  7. namespace fishc2
  8. {
  9.     int age=25;
  10. }
  11. using fishc1::age;
  12. int main()
  13. {
  14.     cout << age << endl;
  15.     cout << fishc2::age << endl;
  16.     age = 25;
  17.     fishc2::age = 20;
  18.     cout << age << endl;
  19.     cout << fishc2::age << endl;
  20. }
复制代码

4.5.2.2using namespace 空间名;
如果整个命名空间都想直接使用,就声明整个命名空间,例如
  1. #include <iostream>
  2. using namespace std;
  3. namespace fishc
  4. {
  5.     int age1=20;
  6.     int age2=25;
  7. }

  8. using namespace fishc;
  9. int main()
  10. {
  11.     cout << age1 << endl;
  12.     cout << age2 << endl;
  13.     age1 = 25;
  14.     age2 = 20;
  15.     cout << age1 << endl;
  16.     cout << age2 << endl;
  17.    
  18. }
复制代码


说到这里,细心的人可能发现,第二行的using namespace std;好像就是这种用法,那么开头那个程序也可以这样写
  1. #include <iostream>

  2. int main()
  3. {
  4.         std::cout << "hello world!" << std::endl;
  5. }
复制代码


4.6命名空间的嵌套
  1. namespace  ns1
  2.       {
  3.           namespace  ns2
  4.           {
  5.               namespace ns3
  6.               {
  7.                   show();
  8.               }
  9.           }     
  10.       }
复制代码

使用show函数就是ns1::ns2::ns3::show();

4.7命名空间重命名
namespace ns4 = ns1::ns2::ns3;
现在再调用show函数就可以ns4::show();
这个看看就知道什么意思了吧

4.8无名命名空间
4.8.1概念
一个数据如果没有定义在任何命名空间中,则这个数据属于无名命名空间
还有一种显式的无名命名空间,例如
  1. #include <iostream>
  2. using namespace std;
  3. int  age1 = 20;

  4. /* 相当于static的效果,不能跨文件访问 */
  5. namespace
  6. {
  7.     int age2 = 25;
  8. }
  9. int main()
  10. {
  11.     cout << age1 << endl;
  12.     cout << ::age1 << endl;
  13.     cout << age2 << endl;
  14.     cout << ::age2 << endl;
  15. }
复制代码
  1. #include <iostream>
  2. using namespace std;
  3. int  var = 100;
  4. namespace ns
  5. {
  6.     int var = 200;
  7.     void fun(void)
  8.     {
  9.         cout << ns::var << ' ' << ::var << endl;//200 100
  10.      }
  11. }

  12. using namespace ns;
  13. cout << var << endl;//错误
  14. cout << ns::var << ' ' << ::var << endl;//200 100

  15. using ns::var;
  16. cout << var << ' ' << ::var << endl;//200 100
复制代码

总结:
1.头文件的不同
2.基本的输入输出
3.命名空间

下期预告:c++中的数据类型,函数,函数重载,哑元函数参数,函数参数的默认值和内联函数

评分

参与人数 3荣誉 +18 鱼币 +18 贡献 +14 收起 理由
抹语 + 5 + 5 + 3 热爱鱼C^_^
world.com + 5 + 5 + 3 感谢楼主无私奉献!
小甲鱼 + 8 + 8 + 8 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-8 16:12:03 | 显示全部楼层
非常不错,请继续加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-11 14:33:49 | 显示全部楼层
谢谢楼主帮助很大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-31 23:17:40 | 显示全部楼层
楼主辛苦了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表