C++ Primr学习笔记(C++基础)

C++ 基础

  • 变量和基本类型
  • 字符串 向量和数组
    • 命名空间的using声明
    • 标准库类型string
      • 直接初始化和拷贝初始化
      • 基本操作
      • string对象的输入输出
      • empty()方法
      • size()函数和string::size_type类型
      • string对象的比较
      • string对象的赋值和相加
      • cctype头文件以及C++规范的头文件格式
      • 范围for遍历string对象
      • 使用范围for改变string对面的值
      • 下标运算符([])(索引)
    • 标准库vector
      • 定义和初始化vector对象
      • 列表初始化vector对象
      • 创建指定数量的元素
      • 向vector对象中添加元素
      • vector中元素的访问
      • 索引相关
    • 迭代器介绍
  • 表达式
  • 语句
  • 函数


变量和基本类型


字符串 向量和数组


命名空间的using声明

C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。
使用using声明避免每一次显示声明命名空间 用法
using namespace::name;
例如

#include 
using std::cin;

int main()
{
    int i;
    cin >> i;
    std::cout << i;
    return 0;
}

按照规定 推荐每个名字都需要有单独的using声明
且头文件中不应包含using声明 避免始料未及的名字冲突


标准库类型string

可变长的字符序列
使用string类型必须包含头文件
string类型包含在命名空间std中
定义和初始化string有以下几种方式

string s1;     		// 默认初始化 s1是一个空字符串
string s2 = s1;	 	// s2是s1的副本 拷贝初始化
string s3 = "hiya"; // s3是该字符串字面值的副本 拷贝初始化
string s4(2, 'c');  // s4的值是"cc" 直接初始化

直接初始化和拷贝初始化

使用等号=初始化一个变量 实际上执行的是拷贝初始化 编译器吧等号右侧的初始值拷贝到新创建的对象中去
如果不适用等号 则是直接初始化
copy initialization
direct initialization


基本操作

C++ Primr学习笔记(C++基础)_第1张图片


string对象的输入输出

读取输出string对象使用cin cout
cin读入遇到空格或换行停止
读取一整行的string对象使用getline()

string s1, s2;
cin >> s1;
getline(cin, s2);

getline()读取一行忽略了最后的换行符
size()函数返回的是一个unsigned类型的整数(注意不要随便喝int混用 以及判断越界情况)
比较 相加 赋值都是比较简单的 自己敲代码尝试可以
把string当做字符数组处理可以


empty()方法

empty()方法根据string对象是否为空返回一个布尔值

string str;
if (str.empty())
{
	cout << "str is empty";
}

size()函数和string::size_type类型

string str;
string::size_type len = str.size();

size()函数返回string对象的长度
size()函数返回的是一个string::size_type类型的变量
string::size_type是一种无符号整形
注意 不要将无符号整形和int混用 会产生意想不到的后果
在这里插入图片描述


string对象的比较

C++ Primr学习笔记(C++基础)_第2张图片


string对象的赋值和相加

对于string对象而言 允许直接把一个对象赋值给另一个对象

string str1(10, 'c');
string str2 = str1;				// 这样直接赋值string对象是合理的

string对象的相加可以直接使用加法运算符 + 把两个string对象拼接到一起
也可以使用假发运算符把string对象和字面值相加
字面值就是类似于"asdashdhaskjhdkjas"这种双引号中的字面字符串
在这里插入图片描述
注意 不能直接把两个字面值相加 必须确保语句中加法运算符两侧的运算对象至少有一个是string
C++ Primr学习笔记(C++基础)_第3张图片


cctype头文件以及C++规范的头文件格式

C++ Primr学习笔记(C++基础)_第4张图片
划重点 我一直倾向于C++的程序就用C++的写法 虽然C++是兼容C 并且为了兼容C做了很多的工作
但是在某些特性上 我还是倾向于用C++的写法 比如以下

C++ Primr学习笔记(C++基础)_第5张图片


范围for遍历string对象

range for是C++11标准提供的一种新语句 语法形式为
for (declaration : expression)
statement
其中 expression是一个对象 标示序列 declaration部分负责定义一个变量 用于访问序列中的基础元素
auto:C++11中,auto不再是一个存储类型指示符,而是一个自动推导变量的类型
decltype:选择并返回操作数的数据类型。在此过程中,编译器只是分析表达式并得到它的类型,却不进行实际的计算表达式的值。
关于auto和decltype的具体定义和使用参考本文上面的描述 这里不做具体阐述

string str("some thing");
for (auto c : str)
{
	cout << c << endl;
}

上述代码中使用auto关键字决定c的类型 这里是char 每次迭代 将str的下一个字符拷贝到c 通过cout流输出
在看下面的例子

string str("Hello, World!!");
decltype(str.size()) cnt = 0;
for (auto c : str)
{
	if (ispunct(c))		// 判断c是不是标点符号 ispunct的定义参考上文
	{
		++ cnt;
	}
}
cout << cnt << endl;

使用范围for改变string对面的值

如果想要改变string对象的值 就必须把循环变量定义为引用类型

string str = "dasjbdekjasdhashdkj"
for (auto & c : str)    // 注意这里定义的是&c 而不是c 我们这里定义c的引用才能通过改变c改变str的值
{
	c = toupper(c);
}
cout << str << endl;

下标运算符([])(索引)

下标运算符接收的输入参数是string::size_type类型的值
string对象的下标从0开始计算 最后一个字符是s[s.size() - 1]
C++ Primr学习笔记(C++基础)_第6张图片
下标的值被称为下标或者索引 任何表达式的值只要是一个整数就可以作为索引
如果索引是有符号整数(例如int值)将自动转换为string::size_type类型的无符号整数
C++ Primr学习笔记(C++基础)_第7张图片
划重点 如果索引位置的string没有值就会产生数组越界的报错 程序会中断 所以访问一定要判断string的范围 确保在范围内访问
C++ Primr学习笔记(C++基础)_第8张图片
C++ Primr学习笔记(C++基础)_第9张图片
再次强调 不要越界 保证索引的合法 很多很多很多很多新手都会在这个地方跌倒无数次


标准库vector

相同对象的集合
因为容纳着其他对象 所以也被称之为容器
使用头文件
在命名空间std中
使用vector必须包含以下语句

#include 
using std::vector;

vector 是一个类模板(class template)
C++ Primr学习笔记(C++基础)_第10张图片


定义和初始化vector对象

C++ Primr学习笔记(C++基础)_第11张图片


列表初始化vector对象

C++11新标准提供了一种新的初始化vector对象的方法
在这里插入图片描述
注意 使用拷贝初始化时 只能提供一个初始值
如果提供的是一个类内初始值 则只能使用拷贝初始化或者使用花括号的形式初始化

创建指定数量的元素

在这里插入图片描述
例如 int类型的vector对象 默认的初始值都是0
C++ Primr学习笔记(C++基础)_第12张图片
圆括号提供的值用来构造
花括号提供的值表述成列表初始化

划重点 可以自己思考一下{}和()的区别
C++ Primr学习笔记(C++基础)_第13张图片


向vector对象中添加元素

pushback()

vector<int> v;
for (int i = 0; i < 10; ++ i)
{
	v.push_back(i);
}

需要注意下面的问题
C++ Primr学习笔记(C++基础)_第14张图片


vector中元素的访问

访问vector中元素的方法和string差不多
需要注意的是 要是用size_type 需要制定它是由哪种类型定义的 vector对象的类型总是包含着元素的类型 例如

vector<int>::size_type	// 正确的
vector::size_type		// 错误的

C++ Primr学习笔记(C++基础)_第15张图片


索引相关

C++ Primr学习笔记(C++基础)_第16张图片
划重点 确保下标合法的一种有效手段就是尽可能使用范围for语句 强烈推荐


迭代器介绍


表达式


语句


函数



你可能感兴趣的:(C++)