鱼C论坛

 找回密码
 立即注册
查看: 3446|回复: 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程序是这样的
#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++中的数据类型,函数,函数重载,哑元函数参数,函数参数的默认值和内联函数

评分

参与人数 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-10-1 19:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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