文章目录
前言
深蓝学院c++基础与深度解析第一章第二章:c++基础和初探笔记。
一、系统I/O
1.库的调用
标准库调用:#include <iostream>
在本项目中自己创建的库调用:#include "头文件名"
2.函数的调用
名字空间用于防止名称冲突
名字空间
std是c++的一个标准库中所定义的名字空间,可使用如下两种形式调用:
第一种:(域解析符)
std::
第二种:(名字空间别名)
using namespace std
可以把本项目中名字空间(文件代码)下的函数拿过来使用,就不怕两个文件中有相同名字的函数但执行不同功能。
namespace NameSpace1
{
void fun()
{}
}
namespace NameSpace2
{
void fun()
{}
}
int main()
{
NameSpace1::fun();
}
此时可以看到主函数中是使用了域解析符来调用了NameSpace1中的fun()。
注意:不能直接就调用fun(),因为在没有指明名字空间时调用函数,默认是调用的全局空间中的函数,而全局空间中并没有定义fun()函数。如下面就会报错:
int main()
{
void fun()
}
当然也可以使用名字空间别名,这样主函数中既能看到主函数中的函数调用,也能看到你所制定名字空间中的函数,如下:
int main()
{
using namespace NameSpace1;
fun()
}
此时的fun()就是NameSpace1中的fun()函数。
当然,如果觉得NameSpace1这个名字太长,也可以给它重赋一个名字来在主函数中调用:
int main()
{
namespace ns1 = Namespace1;
ns1::fun()
}
这里就是将NameSpace1重命名为了ns1
也可以将using namespace … 放到主函数外面,那从写这一句开始下面所有的都是服从该名字空间中语法和函数的,所以这种方法并不是很推荐,因为这样又有可能造成调用冲突的情况发生。
尤其是当你在头文件中使用了这种方法,然后你在另一个cpp文件中调用了这个头文件,那么你的整个cpp文件都会使用这个名字空间的语法,更加容易名字空间冲突还不方便查找哪里冲突了。
由于c++出自c语言,所以在c++中自然也可以调用一些c中的库,比如使用:
#include <cstdio>
int main()
{
int x = 10;
printf("I have %d pens /n", x)
}
这里就用到了c的printf。
二、猜数字与控制流
1.if 语句
if 语句用于分治选择
- 条件部分:用于判断是否执行
- 语句部分:要执行的操作
假设我们有一个数字10,现在需要大家来猜,如果猜到10 给一个提示,没猜到给另外一个提示
int main()
{
int x = 10;
std::cout << "Please input a number:\n";
int y = 0;
std::cin >> y;
if (y == 10)
{
std::cout << "You are right!\n";
}
else
{
std::cout << "You are wrong!\n";
}
}
2.== 与 = 操作
- == 操作:用于判断两个值是否相等
如上方猜数字的代码中if的条件:y == 10
,这里相当于将10赋值给y,用于判断这两个量为相等的量。
-
= 操作:用于赋值,将数值保存在变量所对应的内存中
如果将条件语句改为y = 10
则无论你输入什么值,他最后都会返回“You are right!”,因为使用单个的等于号相当于让这条语句变成了一个布尔值,(规定:=0返回False,其他数返回True)
那么,相反的,根据c++的语法规定,若将上面条件语句改为y = 0
则无论你输入什么,它最终都会返回“You are wrong!” -
解决问题
我们可以养成一个习惯:将常量放在 == 左边以防止误用
如这里我们可以写成10 == y
,这个和y == 10
是等价的
而当我们不小心只写了一个等号时(10 = y
)系统会直接报错error: lvalue required as left operand of assignment
,这样就能提醒你改过来了。因为10是一个常数,不能作为左值,即放在等号左边
3.while语句
while 语句:用于循环执行
– 条件部分:用于判断是否执行
– 语句部分:要执行的操作
猜数字改进,若输入的不对,程序会继续让你输入,指导输对了为止。
int main()
{
int x = 10;
int y = 0;
while(x != y)
{
std::cout <<"please input a number: \n";
std::cin >> y;
}
}
三、结构体与自定义数据类型
结构体:将相关的数据放置在一起
像 int x;float y等等这样的被称为数据,但是单独调用的话, 其结构性,内聚性不强,可以这样:
(1)可以通过点操作符( . )访问内部元素
像 int x;float y等等这样的被称为数据,但是单独调用的话, 其结构性,内聚性不强,可以这样:
struct Point
{
int x;
int y;
}
void fun(Point p)
{
p.x;
p.y;
}
(2)可以作为函数的输入参数或返回类型
如下:
struct Point
{
int x;
int y;
};
Point fun(Point p)
{
p.x = p.x +1;
return p;
}
int main()
{
Point p;
p.x = 3;
p.y = 5;
p = fun(p);
std::cout << p.x << ' ' << p.y << '\n';
}
(3)可以引入成员函数,更好地表示函数与数据的相关性
struct Point
{
int x;
int y;
void IncX()
{
x = x + 1;
}
};
int main()
{
Point p;
p.x = 3;
p.y = 5;
p.IncX();
std::cout << p.x << ' ' << p.y << '\n';
}
这里通过将函数IncX()引入结构体Point内部,提现了更好的相关性。
这样的做法更像是在构建一个类,这是c++与c的根本区别