C++基础(C++Primer学习)

C++基础(一)

1、字面值常量
字面值常量就是形如“42”,“1”等显而易见的值,每一个字面值常量都对应一种数据类型,比如字符型,整形,浮点型等等。
对于整形字面值,我们可以写作十进制数、十六进制数或者八进制数,定义方式如下:

int a = 10; //十进制
int a = 010; //八进制
int a =0x10; //十六进制

对于字面值的类型,还可以通过添加前缀或者后缀来改变其默认的类型。
2、C++中的复合类型
复合类型是指基于其他类型定义的类型,这里主要介绍----引用和指针
引用为对象起了另外一个名字,引用类型引用另外一种类型。

int i = 0;
int& ip = i;

创建引用时,必须初始化引用。引用的不同在于并非将数据复制一份,而是与原数据绑定,在引用上进行操作就等于在原数据上操作。
指针可以存储原数据的地址,同样的,对指针进行解引用操作,同样也等于对原始数据进行操作

int i = 0;
int& ip = i;
int* p = &i;
ip = 2;
cout << i << endl;
*p = 20;
cout << i;

通过引用将 i变为2,在通过指针解引用将i变为20。
指针可以作为布尔值进行判定,任何非空的指针都会被作为Ture。
特殊的指针----void* :void* 是一种特殊的指针,同样存放地址但是·我们不清楚其地址中存放的数据类型。
指向指针的指针,指针可以分为多级通过*的数量来区分指针级别。
3、auto类型说明符
auto类型说明符允许我们不定义变量类型,由系统自行推断数据的类型。

auto i = 0;
int& ip = i;
auto* p = &i;
ip = 2;
cout <<i << endl;
*p = 20;
cout << i;

修改刚才的程序。
decltype类型指示符
decltype指示符的的作用是选择并返回操作数的数据类型。在此过程中,编译器分析表达式并得到它的类型,不计算表达式的值
4、命名空间的using声明
命名空间包含了其中的成员,因此系统使用时才能识别其作用,标准库的名字空间为std。其中就包含cin和cout,如果不写就会报错。

using namespace std;
std::cin >> a;

两种方式,第一种只要写出后面就都不用再写了,第二种只针对某一函数。
5、标准库类型string
对于字符串或者数组,不使用string类的话就必须初始化其长度,这是明显不合适的。使用string可以输入自定义长度的字符串,其中也可以包含数字。但是对于一个string类对象,中间输入不能包含空格,系统读取到空格就会停止读入。若定义两个或者以上,那么空格刚好可以作为不同类对象的分界。

string s1, s2;
cin >> s1 >> s2;
cout << s1 << endl << s2;

使用for循环来查看一个字符串中的标点个数。其中的ispunct函数用来统计string对象中标点符号的个数。

string s("hello world!");
decltype(s.size()) punct_cnt = 0;
for (auto c : s)
{
	if (ispunct(c))
	{
		++punct_cnt;
	}
}
cout << punct_cnt << " punctuation characters in" << s << endl;

使用toupper函数来将string类的字符全部变为大写

for (auto& c : s)
{
	c = toupper(c);
}
cout << s << endl;

访问string类中的某一位置元素,与数组类似,采用[下标]方式

s[0] //第一个元素

6、标准库类型 vector
标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引来用于访问对象。因为vector中容纳着其他对象,所以它也被称为容器,是一个类模板(C++中既有类模板也有函数模板)。
模板本身不是类或函数,相反可以将模板看作是编译器生成类或者函数的一份说明。编译器根据模板创建类或者函数地过程称为实例化

vector<int> ivec; // ivec保存int类型的对象
vector<Sales_item>  Sales_vec;  //保存Sale_item类型的对象
vector<vector<string>> file;  //向量的元素是vector对象,
//有点难理解,因为vector不是类型而是模板,所以file里面包含的是该模板创建的对象  

vector初始化的不同方式,常用的包含两种,一种是{}方式,一种时()方式,两种方式产生的结果是完全不同的;

vector<int> v1(10);    //v1有十个元素,并且由int类型默认初始化为0
vector<int> v2{10};    //v2有一个元素,值为10

vector<int> v3(10, 1);   //v3有十个元素,每个元素都等于1
vector<int> v4{10, 1};    //v4有两个元素

向vector对象中添加元素,使用push_back可以将一个元素作为vector对象的尾元素压入其中:

vector<int> aj;
for (int a = 0; a < 100; a++)
{
	aj.push_back(a);
}        

读取vector中的某一位置元素,还是[下标]的方式。
其他的一些vector操作:

empty();  //不含元素返回真值
size();    //返回元素个数
push_back;  //提到了
aj[n];     //返回第n个位置上的索引
a1 == a2 ;  // 元素数量与对于位置的元素值完全相同成立
。。。。。
                                

注:访问成员元素时,可以使用下标索引,但是添加元素则不能使用下标方式,但是修改某一位置的元素值,可以使用下标方式

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值