C++复合类型与函数学习总结
C11新增内容:
一、auto类型
1、不清楚变量类型时使用。
2、定义初始值。
二、constexpr对象
1、若对象是常量表达式,可声明为该类型。
2、编译器验证是否为常量表达式,用此可以获得可编译时常量。
3、一定要初始化。
三、decltype
1、选择并返回操作数类型。
这是下学期的第一篇博客,好久没写了,还有些小期待呢。总结一下这四周来学的C++吧,下学期开始学C++但这四周讲的内容还是C语言为主,涉及C++的知识,下周就能正式接触C++的内容了吧。当前学的是理论知识,还没有做题,首先是接触了结构体和枚举,然后是指针、标准库类型string、vector,tolower()返回小写字母toupper()返回大写字母。
结构体:
把一组来自不同类型的数据组合在一起构成复合类型,其中的每个数据都是结构体的成员,这个复合类型就是自己定义的类型。
结构体的成员要通过成员选择运算符“.”来选择或者由结构体类型的指针通过“->”运算符选择。
语法形式:
struct X
{
char c;
};
定义X类型的变量 X s1;
通过X变量s1引用成员c:s1.c = ‘a’;
通过指针ps引用成员c:X*ps = &s1;或s2.c = ps->c;
结构体数组形式:
struct Y
{
int a;
}n[3];
引用成员a:n[0].a=1;n[1].a=2;n[2].a=3;
指针:
int ia[5]用数组时一般会转换为指针,ia是一个int*类型的指针常量,ia和&ia[0]都表示数组第一个元素的地址,可以使用指针对数组进行访问。
int a[10];
for(int *p = a; p < a+10; p++) cout <<*p;
迭代器让指针在数组上的使用更简单更安全。
定义vector<类型>::iterator it1;
string::iterator it2;
vector<类型>::const_iterator it3;
string:: const_iterator it4;
begin()和end()在头文件< iterator >中定义。
用法:begin(数组名)返回第一个元素的指针,end(数组名)返回最后一个元素的下一个位置的指针。
for(auto it = begin(arr); it!= end(arr); ++it)
cout << *it;//逐个输出数组arr中的元素
1、指向数组的指针可以执行解引用、自增、自减、加或减一个整数、两个指针相减、比较等运算,指针加或减一个整数n,结果仍是指针。
2、新指针指向的元素与原来的指针相比前进或后退了n 个位置,两个指针相减的结果是它们之间的距离,参与运算的两个指针必须指向同一个数组中的元素,两个指针如果指向同一个数组的元素,可以利用关系运算符对其进行比较。
标准库string类: 头文件< string >
string 表示可变长度的字符序列,字符串是对象,string 类支持字符串对象的各种操作,各种初始化方式,字符串之间的复制、比较、连接、查询字符串长度和判断字符串是否为空、访问字符串中的单个字符。比字符数组方便得多。
string s1, s2;//创建两个空字符串对象
string s3 = “Hello, World!”;//创建s3,并初始化
string s4("I am ");s2 = “Today”;//赋值
s1 = s3 + " " + s4;//字符串连接
s1 += " 5 “;//末尾追加
cout << s1 + s2 + “!” <<endl;//输出字符串内容
cout <<s1.size() << endl;//输出s1长度,包括空格
for (size_t i = 0; i < s1.size(); ++i)
cout << s1[i] <<” ";//逐个输出s1中的字符
string常用的操作:
s.empty()s为空返回true,否则返回false
s.size()返回s中字符的个数,返回的长度是string::size_type类型
s[n]返回s中第n个字符的引用,位置n从0开始
s.c_str()转换,返回s中内容对应的c风格字符串首地址,结果为const char*类型:
两个string相等意味着它们的长度相同,并且所包含的字符也完全相同,字符串的大小关系依照字典顺序定义且区分大小写字母。(例如Hello<hello)
标准库类型vector(动态数组): 头文件< vector >
vector的特点:
表示对象的集合,其中所有对象的类型都相同,可以通过索引访问各个对象,vector是对象,其中容纳着其他对象,被称为容器。
vector的用法:
vector是长度可变的向量,可替代内置数组更灵活,更高效。
vector的操作:
v.empty()v中没有任何元素返回true,否则返回false
v.size()返回v中元素的个数
v.push_back()向v的尾端添加一个值
v.pop_back()删除v末尾的元素,如果v为空,行为未定义
函数:
函数定义的语法形式为:返回类型 函数名(参数列表) { 函数体 }
int change(int v1, int){ … } //第二个参数没名字不能使用
函数在使用之前必须声明,一个函数可以在程序中多次声明,函数定义也可以被用作声明,但是函数在程序中只能定义一次。
参数传递:有传数值,传地址(指针),传引用(&)
当实参的值被复制给形参时,形参和实参是两个独立的对象,实参被称为按值传递,或传值调用函数,传数值不会改变实参的内容,实参一定是确定值的量不是形参形式。
当形参是引用类型时,对应的实参被称为按引用传递,或者传引用调用函数,此时,引用形参绑定到实参,是实参对象的别名,操纵的形参是实参的别名,因而可以改变实参的值。
传值方式的选择:
1、只有返回一个值,用传值,多个用指针和引用。
2、指针风险高,慎用。
3、结构体排序 bool cmp(const X &a,const X &b)
{
return a.a>b.a;
}
4、数组和函数作参数时必须传指针。
参数声明为const引用,可以避免实参被修改
函数调用和返回:
函数调用会使程序的控制权传递给被调函数,当被调函数执行完成时,主调函数从调用语句之后的语句恢复执行,函数在执行完函数体的最后一条语句或遇到return语句时返回。
1.return:
return;//用在返回类型为void的函数中,不是必需的
return 表达式;//用于其他类型
非void的函数必须返回一个与声明类型匹配的值,否则会引起编译错误
2.返回类型:
(1)返回值:默认情况下,函数的返回值是按值传递的;返回值的方式和初始化变量或形参的方式完全一样。
(2)返回引用:将函数声明为返回引用,则不需要对return语句中的表达式进行复制,而是返回对象本身。
3.main函数的返回值:
main函数的返回类型为int,main()函数返回0表示执行成功,返回非0值表示执行失败。
允许main函数没有return语句直接结束。
下面是帮助我理解传值、传地址、传引用的一段代码
#include<iostream>
using namespace std;
int n=20;
void change1(int n){
n++;
}
void change2(int &n){
n++;
}
void change3(int *n){
*n+=1;
}
int main()
{
int m=10,=10;
change1(n);
change1(m);
change1(&a);
cout<<n<<endl<<m<<endl<<a;
}
输出结果
20
11
11
下面这张图是结构体中系统分配存储空间的示意图