![在这里插入图片描述](https://img-blog.csdnimg.cn/ef86f3bd18db42828f9363dffe502626.png)
从Hello World谈起
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
}
#include <iostream>
void fun(const char* pInfo)
{
std::cout << pInfo << std::endl;
}
int main()
{
fun("Hello world");
fun("Hello China");
}
函数可以被反复调用。
void表示这个fun函数,不需要任何的返回值。
main是一个非常特殊的函数,它是由系统进行调用的,是整个程序的入口,main通过函数名调用不同的函数。c++必须有一个main,底层操作系统调用c++,最开始调用的函数就是main。main的返回值会返回操作系统。为什么要有返回值,一个程序运行可能会出错,我们要通过返回值看是否成功。0表示是否成功。不成功,会有各种各样的问题,成功就返回0.
c++如果不是void的函数,必须要返回相应的类型。main例外,如果不写return,默认返回0.
main函数的返回类型一定是int。其他函数返回类型是千差万别的。
另一种写法
语句块
告诉读者,这个形参作为一个占位符。
形参(形式参数)列表:函数名后面的()内容。
系统 I/O
include,既可以使用<>,也可以使用"“。区别在于”“,系统会在当前目录下去查找头文件。如果用的是<>,系统会从整个的操作系统的环境变量中的库去找。如果是我们工程自己写的头文件,我们用”",一些cpp标准库提供的,我们使用<>。自己的头文件,一般有后缀.h等。标准库一般没有后缀。
cin中的c:character。
输入流有1个,输出流有很多个。
输入流用户通过键盘输入,输出通常是输出到屏幕上。
int main()
{
int x;
std::cout << "How old are you:";
std::cin >> x;
std::cout << "You are " << x;
}
cerr和clog的区别在于是否立即刷新缓冲区。一个个字符输出效率比较低,所以一般会先输出到缓冲区,一个缓冲区一般包括64k或者多少个字节。当缓冲区满了的时候,我们会一次性的将内容输出到屏幕或者文件。如果程序中有bug,又没有及时刷新缓冲区,那么我们就无法精确定位到哪里出了问题。所以虽然刷新缓冲区会降低效率,但是我们还是希望及时的刷新缓冲区。
cerr是立即刷新缓冲区(是自动的),clog不是立即刷新。如果我们自己是手动操作刷新缓冲区,需要使用std::flush或者std::endl(加入了自动换行).
通常情况,只有在必要的时候,使用endl。
名字空间,防止名字冲突。
#include <iostream>
// function
/*
klsjfkjsd
lksdjflkdsj
sldkjfsdl
*/
namespace NameSpace1
{
void fun()
{ }
}
namespace NameSpace2
{
void fun()
{ }
}
int main()
{
NameSpace1::fun();
NameSpace2::fun();
}
int main()
{
using namespace NameSpace1;
fun();
}
int main()
{
namespace ns1 = NameSpace1;
ns1::fun();
}
我们可以通过namespace自己定义一些名字空间。std是cpp标准的名字空间,标准库。
名称改变name mangling。
filt -t。是demangling。解改变。
#include <iostream>
int main(int argc, char const *argv[])
{
/* code */
std::cout << "Hello Wei" << std::endl;
int x = 1;
printf("I have %d cat\n", x);
return 0;
}
猜数字与控制流
#include <iostream>
int main(int argc, char const *argv[])
{
int x = 42;
std::cout << "Please input a number:" << std::endl;
int y = 0;
std::cin >> y;
if (y == 42)
{
std::cout << "Right" << std::endl;
}
else
{
std::cout << "Wrong" << std::endl;
}
}
左值是可以放在等号左边的,右值是放在等号右边的。
42是一个常量,不能做左值。y是一个变量,是一个右值。
#include <iostream>
int main(int argc, char const *argv[])
{
int x = 42;
int y = 0;
while (x != y)
{
std::cout << "Please input a number : " << std::endl;
std::cin >> y;
}
}
#include <iostream>
int main(int argc, char const *argv[])
{
int x = 42;
int y = 0;
while (true)
{
std::cout << "Please input a number : " << std::endl;
std::cin >> y;
if (x == y)
{
std::cout << "Right" << std::endl;
break;
}
}
}
结构体与自定义数据类型
#include <iostream>
struct Point
{
/* data */
int x;
int y;
};
void fun(Point p)
{
p.x;
p.y;
}
int main(int argc, char const *argv[])
{
Point p;
p.x;
p.y;
}
使用Point表示一个点,比传入fun(x,y)有更清晰的表达。通过.操作元素。
#include <iostream>
struct Point
{
/* data */
int x;
int y;
void IncX()
{
x += 2;
}
};
int main(int argc, char const *argv[])
{
Point p;
p.x = 10;
p.IncX();
std::cout << p.x << " " << p.y << std::endl;
}
将函数引入struct,更像是一个类。