c++基础

C++是一种支持面向对象编程的高级语言,以其性能、灵活性和强大的功能著称。它引入了类的概念,使得大型软件项目的组织更加清晰。C++中的标准输入输出主要通过iostream库,如std::cin和std::cout进行。命名空间用于解决标识符冲突,如std命名空间。文章还介绍了bool类型和string类的使用,以及如何处理和输入字符串。
摘要由CSDN通过智能技术生成

1. C++的语言特点及优势

c with class(类)

c plus plus

大型的软件项目,要使用面向对象的思想编程。但是C语言的语法是面向过程的。

现有面向对象的思想,后有面向对象的语言。

C++实现了面向对象程序设计;

在高级语言当中,处理运行速度是最快的。

C++语言非常灵活,功能非常强大。如果说C语言的优点是指针,那么C++的优点就是性能和类层次结构的设计。

C++非常严谨、精确和数理化,标准定义很细致。

C++语言的语法思路层次分明、相呼应;语法结构是显式的、明确的。

2.简介

1 C++的含义

c with class

c plus plus 简称c++

2 文件后缀

.cpp

3 编译命令

g++ test.cpp -o test

4 C++的标准库头文件没有.h

5 C++兼容C语言中的头文件

stdio.h在c++中也能使用,c++建议把stdio.h写成

stdio.h --- cstdio

stdlib.h --- cstdlib

string.h --- cstring

3. c++与c区别:

例如五子棋游戏:

面向过程的设计思路:

① 开始游戏

② 黑子先走

③ 绘制画面

④ 判断输赢

⑤ 轮到白子

⑥ 绘制画面

⑦ 判断输赢

⑧ 返回步骤2

⑨ 输出最后结果

面向对象的设计思路:整个五子棋可以分为 :

① 玩家系统,黑白双方,这两方的行为是一模一样的

② 棋盘系统,负责绘制画面

③ 规则系统,负责判定诸如犯规、输赢等。

第一类对象(玩家对象)负责接受用户输入,

并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,

同时利用第三类对象(规则系统)来对棋局进行判定。

总结:

1) 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,

使用的时候一个一个依次调用就可以了。

2) 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,

而是为了描叙某个事物在整个解决问题的步骤中的行为 。

二、标准输入输出

1. 第一个c++程序

输出:hello world

示例1:

#include <iostream>

//io输入输出 stream流

//std::cout 输出流对象 对象在面向对象语言中指的是类的一个实例,就是用类定义的变量。

//std::是cout的命名空间

// << 运算符重载,后面会学的语法。 在这里是将<<的右值给左值,在这里是使用输出流对象输出字符串。

// << 继续给cout输出 std::endl; 换行符 end line

//C++的main返回值必须是int

int main()

{

std::cout<<" hello world !"<<std::endl;

return 0;

}

编译:g++ test.cpp -o test

运行:./test

2. 输出流对象

输出流对象可以自动识别基本类型的输出类型

std::cout

对象?

示例2:

#include <iostream>

int main()

{

int a = 10;

char c = 'q';

std::cout<<a<<" "<<c<<std::endl;//10 q 自动识别要输出变量的类型

return 0;

}

练习1:

使用for循环输出10个整数 0~9

改进优化:

在C++中for循环的表达式1可以定义变量,变量的作用域是表达式1、

表达式2、表达式3和循环体,生命周期是整个for循环的过程

# include <iostream>

int main()

{

//如果for循环结束后还想要使用i,那么i就不能定义在表达式1里面

for(int i = 0;i < 10;i++)

{

std::cout<<i<<" ";

}

std::cout<<std::endl;

return 0;

}

3. 输入流对象

输入流对象可以自动识别基本类型的数据类型

std::cin

示例3:

#include <iostream>

int main()

{

int age;

std::cout<<"please input age:"<<std::endl;

std::cin>>age;//从输入流获得一个整数存放到age变量中,cin会根据变量类型自动识别要输入的数据类型。

std::cout<<age<<std::endl;

//<< >>都指向了数据流的方向

}

练习2:

输入一个字符 如果是大写 则转为小写 如果是小写则转为大写

#include <iostream>

int main()

{

while(1)

{

char c;

std::cin>>c;

if(c>='A' && c<='Z')

{

c+=32;

}

else if(c>='a' && c<='z')

{

c-=32;

}

std::cout<<c<<std::endl;

}

return 0;

}

4. cin同时获取多个值

示例4:

#include<iostream>

int main()

{

std::cout<<"请输入一个age"<<std::endl;

int age;

char f;

std::cin>>age>>f;//age的数据需要先输入

std::cout<<"my age is"<<age<<" "<<f<<std::endl;

return 0;

}

std::cout

std::cin

都是C++给我们定义好的对象。

三、命名空间

1.使用命名空间的目的

避免同名冲突, 学名:避免命名空间污染

注意:C++语言只有一个命名空间std,C++定义的所有的类和对象都是std这个命名空间下的命名的

C++的标准库都是在std命名空间中定义的

2.命名空间的表示方法

(1)方法1

最常见的用法

使用时 加上 using namespace std;就可以

示例5:

#include <iostream>

using namespace std;//声明下面的代码都使用std命名空间

int main()

{

char c;

cin>>c;//前面不用加std::

if(c>='a'&&c<='z')

{

c -= 32;

}

else if(c>='A'&&c<='Z')

{

c += 32;

}

cout<<c<<endl;

}

C++只给我们提供了一个命名空间std。

练习3:

使用命名空间的方式,输入年龄age,输出:“my age is "age;

#include <iostream>

using namespace std;

int main()

{

int age;

cin>>age;

cout<<"my age is "<<age<<endl;

return 0;

}

(2)方法2

最不常见的用法

示例6:

#include<iostream>

//把使用到的内容单独进行声明

using std::cout;

using std::cin;

using std::endl;

int main()

{

cout<<"hello world!"<<"my god";

cout<<"come on baby!"<<endl;

char name[20];

cout<<"please input name:";

cin>>name;

cout<<"name:"<<name<<endl;

return 0;

}

(3)方法3

示例7:

迫于无奈

当两个命名空间中有相同的标识符时,在使用这个标识符的时候必须把命名空间写在前面!

假设有一个叫mystd的命名空间里也有一个cout

std::cout

mystd::cout

#include<iostream>

using namespace std;

using namespace mystd;

int main()

{

std::cout<<"hello world!"<<"my god";

std::cout<<"come on baby!"<<std::endl;

char name[20];

std::cout<<"please input name:";

cin>>name;

std::cout<<"name:"<<name<<std::endl;

return 0;

}

3.自己写命名空间

示例8:

自定义命名空间teacher

#include<iostream>

using namespace std;

//namespace定义命名空间的关键字,teacher是定义的命名空间的名字

namespace teacher

{

//在命名空间里定义

char name[20] = "小明";

//命名空间内部可以定义任何内容

}

//using namespace teacher;

int main()

{

//因为name是定义在teacher命名空间里,所以要么先声明使用teacher命名空间,要么在name前面加上teacher::

cout<<teacher::name<<endl;

return 0;

}

示例9:

定义命名空间teacher和worker

#include<iostream>

using namespace std;

//定义命名空间teacher

namespace teacher

{

char name[20] = "大神";

int age = 15;

}

//定义命名空间worker

namespace worker

{

char name[20] = "大爷";

int wight = 180;

}

//两个命名空间都有name

using namespace teacher;

using namespace worker;

int main()

{

cout<<teacher::name<<endl; //因为teacher和worker都有name,所以这里必须写命名空间

cout<<age<<endl; //因为只有teacher里有age,所以这里使用的是teacher里的age

}

如果想深造推荐书 C++primer第五版,不要通篇的读,要当做字典看。

注意不是C++ primer plus

练习4:

分别在teacher和worker命名空间中添加函数showName()来输出name

main中,调用两个函数showName();

#include <iostream>

using namespace std;

namespace teacher

{

char name[] = "大神";

int age = 18;

void showName()

{

cout<<name<<endl;//优先选择同一个命名空间的成员

}

}

namespace worker

{

char name[] = "大爷";

int wight = 180;

void showName()

{

cout<<name<<endl;

}

}

using namespace teacher;

using namespace worker;

int main()

{

teacher::showName();

worker::showName();

return 0;

}

思考:两个命名空间里的成员是不是全局变量?是全局变量!

4.匿名命名空间

示例10:

当定义全局变量,不指定命名空间时,C++会默认将全局变量放在匿名命名空间中

#include <iostream>

using namespace std;

int a = 10;//没有指定命名空间的全局变量

int main()

{

int a = 20;//定义局部变量a

cout<<::a<<endl;//::a是使用匿名命名空间的全局变量a

return 0;

}

:: 域

命名空间的作用只在起名上

自定义名字空间:

(1)名字空间::name

(2)内部优先

(3)全局变量,会默认放在匿名命名空间中

四、bool类型

bool是基本数据类型(内置类型,不需要声明就能使用的类型),用来表示逻辑真假。

C++依然可以使用0和非0表示真假,C++增加bool类型专门表示真假true false

真假: 非0为真(true) 0是假(false)

bool类型能够增强程序可读性

int empty();

bool empty();

示例11:

#include<iostream>

using namespace std;

int main()

{

bool b1;

b1 = 10;

//正常情况下输出bool类型的值就是0 1

cout<<b1<<endl;

bool b2;

b2 = -23;

cout<<b2<<endl;

bool b5;

b5 = 0;

cout<<b5<<endl;

bool b3;

b3 = true;

cout<<b3<<endl;

bool b4;

b4 = false;

cout<<b4<<endl;

cout<<sizeof(b4)<<endl;//1字节

//bool 类型有多大?

//A 1字节

//B 2字节

//C 至多1字节

}

示例12:

#include<iostream>

using namespace std;

int main()

{

bool gender = true;

bool sex = false;

cout<<(gender?"帅哥":"美女")<<endl;

cout<<(sex?"帅哥":"美女")<<endl;

cout<<"gender"<<boolalpha<<gender<<endl;//boolalpha输出true和false,需要在除数bool变量之前加 输出 true

cout<<"sex:"<<sex<<endl; //false

bool c = true;

cout << "c = " <<noboolalpha<< c << endl;//noboolalpha取消true和false的输出 输出1

}

4、字符串处理

1.c++字符串有两种处理方法

1) c风格 用字符数组存储 用字符指针操作 char s[100]="mygod"; char *p = “hello”;

C语言字符串的两个要素:1. '\0'结尾 2. 字符串首地址

2) c++ 标准库中string类

2. string类的操作

(1)需要加头文件#include<string>

注意:string是C++的头文件,不是C语言的头文件,和string.h不是一回事, 推荐写成<cstring>

(2)需要加std命名空间 using namespace std;

(3)赋值 连接 拷贝。。。

示例13:

创建string对象

#include <iostream>

#include <string>

using namespace std;

int main()

{

//string是类类型 class type

string s1 = "hello world";//创建string对象s1,存放字符串"hello world"

string s2("hello farsight");

string s3(s2);//使用s2创建s3,使用s2拷贝s3

string s4 = s3;//使用s3拷贝s4

cout<<s1<<endl;//hello world

cout<<s2<<endl;//hello farsight

cout<<s3<<endl;//hello farsight

cout<<s4<<endl;//hello farsight

}

void fun(char* s)

{

}

void fun2(string s)

{

}

示例14:

转换

(1)c风格转为c++风格

string s = "abvc";

(2) 将string转换成C风格字符串

c_str() 将string转成char*

C++推荐我们使用string字符串,但是有些时候api的参数需要我们使用C风格字符串char* 类型的参数,这时候需要我们将string转换成C风格字符串。

#include <iostream>

#include <string>

#include <cstdio>//声明sprintf

using namespace std;

int main()

{

string s1 = "hello world";

char buf[100];

//格式化字符串%s只要char* 参数

sprintf(buf,"s1 = %s",s1.c_str());//将s1转换成 char*类型

cout<<buf<<endl;

}

示例15:

赋值

string对象赋值可以通过赋值符号 =,直接将值赋予给目标对象

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s = "hello world";

string s2 = "hello farsight";

s2 = s;//将s中存放的字符串放到s2里面,此时s2里也是hello world

cout<<s2<<endl;

}

示例16:

拼接

string可以通过”+ +=”来与string对象进行拼接,

注意: string只能拼接string,如果需要拼接其他类型,只能使用sprintf()进行复杂的字符串格式化

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s1 = "hello";

string s2 = " world";

s1 += s2;

cout<<s1<<endl;

//s1 += 1;//?不可以 string只能和string做加法

//如果就是想把整数加到string中,在C++string类中没有好办法,还得使用sprintf

char buf[100];

sprintf(buf,"%s %d",s1.c_str(),1);

cout<<buf<<endl;//hello1

}

示例17:

比较 == != < > <= >= 真假 true false

字符串比较比的是什么?比较的是第一个不相等字符的ascii码值。

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s1 = "hello world";

string s2 = "hello world";

cout<<(s1==s2)<<endl; //1

string s3 = "hello farsight";

cout<<(s3!=s1)<<endl; //1

cout<<(s1>s3)<<endl; //1

if(s1 == s2)

{

cout<<"="<<endl;

}

else

{

cout<<"!="<<endl;

}

}

示例18:

string类型的成员函数

empty() 和 size()

empty()判断空,如果字符串是空返回true

size()返回字符串长度,算法和strlen是一样的。

#include <iostream>

#include <string>

#include <cstdio>

using namespace std;

int main()

{

string s = " ";

cout<<s.empty()<<endl;//0

string s2 = "";

cout<<s2.empty()<<endl;//1

string s3 = "hello world";

cout<<s3.size()<<endl;//11

cout<<sizeof(s3)<<endl;//4 和字符串有多长无关 string类型中只有一个成员变量char*

}

示例19:

获取字符对象

C++可以通过字符串对象[下标]来直接获取该位置的字符。

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s = "hello world";

for(int i = 0;i < s.size();i++)

{

cout<<s[i];//s[i]获得s中i元素的字符,s[0]是h

}

cout<<endl;//只输出一个换行

s[0] = ‘w’;//将s对象0元素的h赋值成w

cout<<s<<endl;//wello world

}

示例20:

cin输入字符串

cin无法输入空格 如果输入有空格 只拿到空格之前的

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s;

cin>>s;//将输入的字符串存放到对象s中

cout<<s<<endl;

}

示例21:

getline输入字符串 遇到'\n'结束输入

getline()不是string的成员函数

读入一行的字符串,包括空格。

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s;

getline(cin,s);//参数1 cin是输入流对象获得字符串,如果将cin换成其他的流对象,就可以从其他地方读取字符串,参数2 是读取字符串后存放的地方

cout<<s<<endl;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值