C++ 笔记01

C++ 笔记01

一、开始

C++的语言特点及优势

C++实现了面向对象程序设计;
在高级语言当中,处理运行速度是最快的。
C++语言非常灵活,功能非常强大。如果说C语言的优点是指针,那么C++的优点就是性能和类层次结构的设计。
C++非常严谨、精确和数理化,标准定义很细致。
C++语言的语法思路层次分明、相呼应;语法结构是显式的、明确的。

简介

C++含义

C++是面向对象的语言,编程需要使用面向对象的思想。使用C语言编程也要使用面向对象的思想。
c with class于是有在c++上添加了一些面向对象的语法。
c plus plus 简称c++

文件后缀

.cpp

Linux下编译命令

g++ test -o test.cpp

C++的标准库头文件没有.h
C++兼容C语言中的头文件

stdio.h在c++中也能使用,c++建议把stdio.h写成
stdio.h — cstdio
stdlib.h — cstdlib
string.h — cstring

C++和C的区别

例如五子棋游戏:

面向过程的设计思路:
① 开始游戏
② 黑子先走
③ 绘制画面
④ 判断输赢
⑤ 轮到白子
⑥ 绘制画面
⑦ 判断输赢
⑧ 返回步骤2
⑨ 输出最后结果

面向对象的设计思路:整个五子棋可以分为 :
① 玩家系统,黑白双方,这两方的行为是一模一样的
② 棋盘系统,负责绘制画面
③ 规则系统,负责判定诸如犯规、输赢等。

第一类对象(玩家对象)负责接受用户输入,
并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,
同时利用第三类对象(规则系统)来对棋局进行判定。

总结
  1. 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
  2. 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 。

二、标准输入输出

示例1

#include<iostream>//流  数据流 从A点移动到B点,以字节或者字符为单位移动
//C++的main函数,返回值必须是int类型
int main()
{
std::cout<<" hello world !"<<std::endl;//printf(“hello world\n”);
return 0;
}

编译:g++ test.cpp -o test
运行:./test

输出流对象

输出流对象可以自动识别基本类型的输出类型
std::cout C++给我们定义好的输出流对象,用类类型或者结构体类型定义的变量叫对象。
比如:

struct Student
{
char name[20];
int age;
};

示例2

#include <iostream>
int main()
{
	int a = 10;	
	char c = 'q';
//std::cout会自动识别输出变量的类型
	std::cout<<a<<" "<<c<<std::endl;//10 q换行
return 0;
}

练习1

使用for循环输出10个整数
[collapse status=“false” title=“查看编程代码”]

#include <iostream>
int main()
{
	int i;
	for(i = 0;i < 10;i++)
	{
		std::cout<<i<<std::endl;
	}
	return 0;
}

[/collapse]

改进优化

在C++中for循环的表达式1可以定义变量,变量的作用域是表达式1、表达式2、表达式3和循环体,生命周期是整个for循环的过程。
[collapse status=“false” title=“查看代码”]

#include <iostream>
int main()
{
	//循环变量的作用域for的表达式1,2,3和循环体
	//生命周期到for循环结束
	for(int i = 0;i < 10;i++)
	{
		std::cout<<i<<std::endl;
	}
	return 0;
}

[/collapse]

输入流对象

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

示例3

#include <iostream>
int main()
{
	int age;
	std::cout<<"please input age:"<<std::endl;
	std::cin>>age;//scanf
	std::cout<<age<<std::endl; //printf("%d",age);
}

C++中所有的对象,只要使用的运算符,都需要运算符重载!
程序解释:
std::cin 输入流对象
>> 运算符重载,指向了数据流的方向

练习2

输入一个字符 如果是大写 则转为小写 如果是小写则转为大写
[collapse status=“false” title=“查看练习代码”]

#include <iostream>
int main()
{
	char c;
	std::cout<<"please input a char"<<std::endl;
	std::cin>>c;
	if(c>='a' && c<='z')
	{
		c -= 32;
		std::cout<<c<<std::endl;
	}
	else if(c>='A' && c<='Z')
	{
		c += 32;
		std::cout<<c<<std::endl;
	}
	return 0;
}

[/collapse]

cin同时获取多个值

示例4

#include<iostream>
int main()
{
	std::cout<<"请输入一个age"<<std::endl;
	int age;
	char f;
	std::cin>>age>>f;//10-->age s-->f 
	std::cout<<"my age is"<<age<<" "<<f<<std::endl;
}

三、命名空间

使用命名空间的目的

避免同名冲突, 学名:避免命名空间污染
注意:C++语言只有一个命名空间std,C++定义的所有的类和对象都是std这个命名空间下的命名的
C++的标准库都是在std命名空间中定义的

命名空间的表示方法

方法1

最常见的用法
标准库的全部都放到名字空间std中 使用时 加上 using namespace std;就可以了

示例5
#include <iostream>
using namespace std;//声明下面的代码,都使用了std的命名空间
::int main()
{
	char c;
	cin>>c;
	if(c>='a'&&c<='z')
	{
		c -= 32;
	}
	else if(c>='A'&&c<='Z')
	{
		c += 32;
	}
	cout<<c<<endl;
}
练习3

使用命名空间的方式,输入年龄age,输出:“my age is "age;
[collapse status=“false” title=“查看练习代码”]

#include <iostream>

using namespace std;

int main()
{
	int age;
	cin>>age;
	cout<<"my age is"<<age<<endl;
	return 0;
}

[/collapse]

方法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
示例7

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

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:";
		std::cin>>name;
		std::cout<<"name:"<<name<<std::endl;
		return 0;
	}

自己写命名空间

示例8

自定义命名空间teacher

#include<iostream>
using namespace std;
namespace teacher//定义命名空间 teacher
{
	char name[20] = "小明";
}
using namespace teacher;
int main()
{
	cout<<name<<endl;
//2.cout<<teacher::name<<endl;  不写using namespace teacher;
}
示例9

定义命名空间teacher和worker

#include<iostream>
using namespace std;
namespace teacher
{
	char name[20] = "大神";
	int age = 15;
}
namespace worker
{
	char name[20] = "大爷";
	int wight = 180;	
}
using namespace teacher;
using namespace worker;
int main()
{
	cout<<teacher::name<<endl; //因为teacher和worker中都有name,如果这里不写命名空间,会出现访问不明确的错误。ambiguous
	cout<<age<<endl;     
}
练习4

分别在teacher和worker命名空间中添加函数showName()来输出name
main中,调用两个函数showName();

[collapse status=“false” title=“查看练习代码”]

#include <iostream>
using namespace std;
namespace teacher
{
	char name[20] = "大神";
	int age = 15;
	void showName()
	{
		cout<<name<<endl;//优先使用本作用域中的成员
	}
}

namespace worker
{
	char name[20] = "大爷";
	int wight = 180;
	void showName()
	{
		cout<<name<<endl;
	}
}

[/collapse]

示例10

匿名命名空间

#include <iostream>

using namespace std;
int a = 10;
int main()
{
	int a = 20;
	cout<<::a<<endl;//当全局变量和局部变量重名时,在函数中访问全局变量通过匿名命名空间。
	return 0;
}

命名空间的作用只在起名上
自定义名字空间:
(1)名字空间::name
(2)内部优先
(3)全局变量 发生冲突时,放入匿名空间 ::name

四、c++增加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;
	cout<<b1<<endl;	//1	
	bool b2;
	b2 = -23;
	cout<<b2<<endl;	  //1  
	bool b5;
	b5 = 0;
	cout<<b5<<endl;   //0
	bool b3;
	b3 = true;
	cout<<b3<<endl;	//1
	bool b4;
	b4 = false;
	cout<<b4<<endl;	//0
	cout<<sizeof(b4)<<endl;	// 1个字节
//bool类型至少占1字节,这句话是对的
}

示例12

#include<iostream>
using namespace std;

int main()
{
	bool gender = true;// 真  1
	bool sex = false; //  假  0

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

	cout<<"gender:"<<boolalpha<<gender<<endl;//boolalpha 字母形式输出  true
	cout<<"sex:"<<sex<<endl;                 //false
	
	bool c = true;	//noboolalpha 字母转换成0 1
    cout << "c = " <<noboolalpha<< c << endl;//1
}

五、字符串处理

C++字符串处理有两种方式

  1. c风格 用字符数组存储 用字符指针操作 char s[100]="mygod"; char *p = “hello”;,C语言字符串的两个要素:'\0'结尾字符类型的地址 //首地址
  2. C++标准库中的string类

string类的操作

  1. 需要加头文件#include<string>
    string是C++的头文件,不是C语言的头文件,和string.h不是一回事,字符串拷贝 拼接 #include<cstring>
  2. 需要加std命名空间 using namespace std;
  3. 赋值 连接 拷贝。。。

示例13

创建string对象

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s1 = "hello world";//s1是string类型的对象,用字符串”hello world”初始化
	string s2("hello farsight");//s2是string类型的对象,用字符串”hello farsight”初始化
	string s3(s2);//s3是用s2复制的string类型对象
	string s4 = s3;//s4是用s3复制的string类型对象
		
	cout<<s1<<endl;//hello word
	cout<<s2<<endl;//hello farsight
	cout<<s3<<endl;//hello farsight
	cout<<s4<<endl;// hello farsight
}

示例14:

转换
(1)c风格转为c++风格
string s = "abvc";
(2) 将string转换成C风格字符串
C++推荐我们使用string字符串,但是有些时候api的参数需要我们使用C风格字符串char* 类型的参数,这时候需要我们将string转换成C风格字符串。

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

int main()
{
	string s1 = "hello world";
	char buf[100];
	sprintf(buf,"s1 = %s",s1.c_str());//sprintf函数不接受string类型参数,但是我们又要将string类型格式化,所以这里需要将string类型对象转换成C风格字符串。
	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赋值
	cout<<s2<<endl;//hello world
}

示例16:

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

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

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1 = "hello";
	string s2 = " world";
	s1 += s2;//把s2的字符串追加到s1后面
	cout<<s1<<endl;//hello world
s1 += 1;//错误 string类型的拼接,只能拼接string类型或者C风格字符串
	//char buf[100];
	//sprintf(buf,"%s %d",s1.c_str(),1);
	//cout<<buf<<endl;//hello1
}

示例17:

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

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s1 = "hello world";
	string s2 = "hello world";
	cout<<(s1==s2)<<endl;     
	string s3 = "hello farsight";
	cout<<(s3!=s1)<<endl;      
//字符串比较,比较的是第一个不相等的字符的ascii码值
	cout<<(s1>s3)<<endl;   
	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类型的大小,和字符串长度没有关系
}

示例19:

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

#include <iostream>
#include <string>
using namespace std;
int main()
{
	
	string s = "hello world";
	for(int i = 0;i < s.size();i++)//11
	{
		cout<<s[i]<<endl;//s[i]是字符串中的i位置的字符
	}	
s[0] = ‘w’;//0位置写入字符
cout<<s<<endl;//wello world
}

示例20:

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

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s;
	cin>>s;//遇到空格输入结束
	cout<<s<<endl;
}

示例21:

getline输入字符串 遇到’\n’结束输入
getline()不是string的成员函数
读入一行的字符串,包括空格。
但在c++中无法使用gets()函数,所以需要使用getline()函数

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s;
	getline(cin,s);//参数1 从cin输入流获得字符串,参数2 读取到的字符串放到s里
	cout<<s<<endl;
}

练习5

输入一个字符串,将其中的大写字母转换为小写字母
[collapse status=“false” title=“查看练习代码”]

#include <iostream>
using namespace std;
int main()
{
	string s;
	cin>>s;
	for(int i = 0;i < s.size();i++)
	{
		if(s[i]>='A' && s[i]<='Z')
		{
			s[i] += 32;
		}
	}

	cout<<s<<endl;
	return 0;
}

[/collapse]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值