目录

C++ 初探

第 1 章笔记


HelloWorld

函数

// int 是返回类型
// main 后的括号是形参列表(为空)
int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}
// pInfo 是 parameter
// test1, test2 是 argument
void  fun(const char* pInfo)
{
     std::cout << pInfo << std::endl;
}

// 无形参的写法
// 通常是执行逻辑中不包含变量,但为了接口需要保留该变量的形参位置
// 因此只写形参类型

void  fun2(const char* pInfo, int)
{
     std::cout << pInfo << std::endl;
}

int main(int argc, char const *argv[])
{
   fun("test1");
   fun2("test2", 1);
   return 0;
}

Main函数

linux 下可以通过下面的命令检查程序的返回值(是否成功运行):

#check the return type of the program
$echo $?

main 的形参列表

int main(int argc, char* argv[]) {}

其他内容

系统 IO

</code cpp> 定义于 iostream 中 如果使用双引号,系统会在当前目录中找 如果使用三角括号,系统会优先找库中的内容 自定义 header 通常给 .h 后缀 #include <iostream> #include “myheader.h” </code>

Iostream

#cout 的内容会输出到 OutputText
#cerr 的内容会输出到 ErrorText
./main > OutputText 2>ErrorText

缓冲区是内存中的一个区域,用于优化读写的速度。缓冲区满了以后,会一次性将内容输出。但问题在于,程序没有正常结束时,缓冲区中的内容会丢失。如果为了查找程序的 Bug,那么这部分内容是需要保留的。这种情况下,需要立即刷新缓冲区。

命名空间

命名空间的存在是为了防止命名冲突。多人开发的过程中很可能会存在同名函数,放在一起可能会存在调用的冲突。这种情况下可以选择将其分置于不同的命名空间内:

namespace NS1 {
    void fun() {
        std::cout << "NS1" << std::endl;
    }
}

namespace NS2 {
    void fun() {
        std::cout << "NS2" << std::endl;
    }

}
没有标明命名空间的函数属于全局空间global space):
void fun()
{
    std::cout << "global fun";
}
调用的方式有三种:

// call
int main(int argc, char const *argv[])
{
    NS1::fun();
    NS2::fun();
}

using namespace NS1;
fun();
# output
# 如果 NS1 中定义了 fun()
NS1
# 如果 NS1 中没有定义 fun(), 全局中定义了 fun()
global fun

  • 如果都定义了 fun(),课程中说会先调用全局 fun(),但测试发现 gcc 13.1.0 报错二义性。慎用
  • using 会导致整个命名空间暴露给其他使用者,应当尽量使用域解析符。

namespace n = NS1;
n::fun();

std 命名空间

# checking the mangling data
nm main.o - o
# demangling,查看 mangling 之前的原始数据
nm main.o - o | c++filt -t

main() 不会做 mangling,因为 main() 是唯一的。

控制流

结构体 / 自定义类型

struct Point
{
    int x = 1;
    int y = 2;
    //member function
    Point fun(Point p)
    {
        p.x += 1;
        p.y += 1;
        return p;
    }
};

int main(int argc, char const *argv[])
{
    Point p;
    //call
    p = p.fun(p);
    std::cout << p.x << " " << p.y << std::endl;
}