c++primer 学习笔记

1.1 编写简单的c++程序

函数4元素:函数类型、函数名、形参表、函数体
调用GNU(UNIX)
g++ prog1.cc -o prog1 //生成可执行文件prog1,UNIX下默认a.out

1.2初窥输入/输出

*格式化输入与输出iostream库包涵输入流istream和输出流ostream
*标准库定义了四个io对象包括:cin(see-in标准输入)、cout(see-out标准输出)、cerr(标准错误,用于输出错误警告和信息)、clog(产生程序执行的一般信息)
*头文件include 自定义头文件用””
*输出操作符”<<”(作用是将其右操作数写入左操作数的ostream对象中)
*endl成为操纵符,作用是换行和刷新缓冲区
*作用域操作符”::”
*输入操作符”>>”(从左istream对象读取数据写入右操作数)

1.3注释

单行注释和多行注释(单行注释用双斜杠//,双行注释使用定界符/ /)
//
/**/
/

*
*
*/

1.4控制结构

1.5类的简

类类型(class type)
通常类类型存储在文件中,文件以.h为后缀
类型Sales_item的一个对象(一个Sales_item对象,一个Sales_item)
*成员函数(由类定义的函数,通常称为类方法)
*点操作符(.)通过左操作数取得右操作数,仅用于类类型的对象,左操作数必须是对象,右操作数必须是类的成员

2.1基本内置类型

*wchar_t宽字符型,存储汉字日语,不能用单个字节存储
*对于整型的赋值,编译器会将越界值取模后再赋值
!C++中将负数赋值给unsigned是完全合法的,其结果是取模后的值
Float精度6位,double类型精度为10位
long double 扩展精度浮点数,运行代价较高

2.2字面值

*true和false是布尔值的字面值
*在字符字面值前加L就够得到wchar_t类型的宽字符字面值
L’a’
*转义字符可由字母,八进制十六进制表示 \a \7 \xddd

2.3变量

复制初始化和直接初始化,复制初始化用等号,直接初始化将初始化式放在圆括号
Int value = 15;
Int value(15);
*string类型在标准库中定义,string定义在std命名空间中
*内置类型在函数体外系统自动初始化为0,在函数体内定义内置类型变量不进行自动初始化
*extern声明变量,不分配存储空间

2.4const限定符

Const定义一个对象为常量,定义时必须初始化
在全局作用域定义的const变量不能被其他文件使用,除非声明extern

2.5引用

变量的别名,定义引用时必须初始化
*Const引用是指指向const对象的引用
Const引用的初始化值也要是const
const int a = 10;
const int &ia = a;

?2.5.3不太懂

2.6typedef名字

用于类型的说明符,是所定义类型的同义词
用于一种类型作用多个目的
typedef int zheng;
zheng a; //int a

2.7枚举

枚举的定义
enum 枚举类型名 {成员1,成员2...};
*枚举的成员是常量,默认第一成员值为0,之后的每个成员再递增
*初始化枚举成员的值必须是一个常量表达式
*对枚举类型赋值只能通过枚举成员或同一枚举类型的其他枚举对象进行

2.8类类型

数据成员的初始化不能在定义时给定
访问标号可以多次的出现在类的定义中
*定义类类型class关键字和struct关键字区别在于第一个访问标号前的任何成员class隐式指定为private而struct默认为public-

2.9编写自己的头文件

头文件用于声明函数,变量,而非定义。但是对于类、常量表达式初始化的const对象、inline内联函数则可以在头文件中定义,原因是每个源文件定义是相同的
*头文件用“”表示自定义头文件,非系统头文件查找通常开始于源文件的位置

3.1命名空间的using声明

3.2标准库string类型

String类型初始化

String s1;
String s2(s1);
String s3(“value”);
String s4(n,’c’);			//填充n个c

用标准输入操作符写入string对象时,忽略开头和结尾的空格
用输入操作符读取string对象,返回输入流是否有效

String IO操作getline函数,接受两个参数

1输入流对象,2string对象
*getline函数读取不含换行符,如果第一个字符就是换行符string对象将被置为空string对象
?输入操作符和getline读取string对象的区别。

String操作

String.size()      string::size_type	返回string对象大小
String.empty()       L				返回string对象是否为空串
string[n]            C				返回string对象第n个字符,其中n的类型是一个string::sizetype类型
    • < > != 都是字符串操作符惯有含义

?string.size()处理汉字如何显示

!任何string类型的size操作结果的变量必须为string::size_type类型

string对象的连接操作

String + string
String+=string
String + ”abc” + string与字符串字面值的连接

string类型在使用下标操作符来访问对象中的单个字符,下标应为一个string::size_type类型的值

for (string::size_type index = 0;index!=str.size() ;index++)
str[index] = ‘*’;

cctype头文件定义各种字符操作函数P77

3.3标准库vector类型

Vector是一个类模板,用来定义多种数据类型,特点是动态增长

初始化

vector<T>  v1;		vector保存类型为T的对象,默认构造函数为v1为空
vector<T>  v2(v1);		v2为v1的副本
vector<T>  v3(n,i);		v3保存n个值为i的元素
vector<T>  v4(n);		保存初始化元素的n个副本

初始化元素的值取决于vector元素类型,如int为0,含默认构造函数的对象初始化元素为默认构造函数的值

vector <string> vs(10)		//含10个空字符串	

vector对象操作

vector.size();				//返回vector对象元素个数
vector.empty();			//检测vector对象是否为空
vector.push_back(t);		//在vector对象末尾增加一个值为t的元素
vector[n]					//返回vector对象中位置为n的元素

成员函数size返回相应的vector类定义的size_type类型,注意不要丢失vector的元素类型

vector :: size_type;

3.4迭代器简介

每种容器都定义自己的迭代器类型,包括vector容器类型

vector <int>::interator iter;			//容器vector<int>定义的interator类型

每种容器定义一对begin和end函数,用于返回迭代器,如果容器中有元素,begin()返回的迭代器指向第一个元素,end()返回的迭代器指向末端元素的下一个,如果此容器为空begin()和end()返回的迭代器相同

vector <int>::interator iter = v1.begin();

begin操作返回的迭代器可进行自增使其指向下一个元素,而end迭代器不指向任何元素所以不能对它进行自增

*iter  ==  v1[0]
++iter  ==   v1[1]

12.1类的定义

public

可被使用该类型的所有代码使用

private

可被其他类成员访问

构造函数:与类同名的成员函数,初始化数据成员

构造函数初始化列表由成员名和带括号的初始值组成,跟在构造函数的形参表之后,并以冒号开头

成员函数: 类内定义的成员函数默认为inline,类外定义需指明在类作用域

封装:将底层元素组合形成新的、高层次实体的技术,函数和类都是封装的一种形式

成员函数的重载

类定义以分号结束,即类定义时可接对象定义列表

前向声明即在定义类成员之前声明一个类,此类为不完全类型,此时不能创建类对象

12.2this指针

this指针由编译器隐含地定义
返回this 返回一个引用 该引用指向执行操作的那个对象
const成员函数,this的类型是指向construction类类型对象的const指针,不能改变this指向的对象,也不能改变this所保存的地址,非const成员函数可以改变this指向的值(对象),不能改变this所保存的地址
!const成员函数不能返回指向类对象的普通引用,只能返回
this作为一个const引用
?mutable修饰
?12.2.4

12.3类作用域

!即使两个类具有相同的成员列表,它们也是不同的类型,因为作用域不同

12.3.1

*如果一个函数定义为外联函数,其返回类型在类中定义,则此返回值类型必须使用完全限定的类型名Screen::index
*函数局部作用域高于类的作用域(如成员函数形参与类成员名相同),如果要使用类成员需要在成员名前this->或classname::
*如果名字相同的全局对象被屏蔽了,可以通过全局作用域来限定名字(::)
?习题12.18

12.4 构造函数

构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void))。

构造函数在类public中定义

构造函数的初始化列表为类的一个或多个数据成员指定初值

默认构造函数通常称为合成的默认构造函数

未提供显示初始值,用来创建对象的构造函数
*构造函数的初始化1.函数头进行初始化(初始化式) 2.函数体进行初始化
!必须对const成员或者引用类型成员以及没有默认构造函数的类类型的任何成员进行初始化式
?习题12.22

12.4.2默认实参

!类包含内置或复合类型成员时,对定义在全局作用域对象才初始化
?12.44

12.5友元函数

友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类

声明以friend 开始,友元声明只能出现在授权类内部

*友元可以是普通的非成员函数,其他类成员函数或整个类
*将整个类设为友元,友元类的所有函数都可以访问授予友元关系类的非公有成员
*将成员函数声明为友元时,函数名必须用该函数所属的类名字加以限定
*友元函数可以在类的内部定义,该函数的作用域扩展到外围该类定义的作用域
*类必须将重载函数集中每一个希望设为友元的函数都声明为

12.6static类成员

类可以定义类静态成员
*static数据成员独立于该类的任意对象而存在
*类可以定义static成员函数,static成员函数没有this形参(因为它不是任何对象的组成部分),static成员函数也不能声明为const,它可以直接访问所属类的static成员,但不能直接使用非static成员
*类外定义static成员函数,无需重复指定static保留字,该保留字只出现在类定义体内部声明处

static成员在类定义体内部声明,在类外作定义和初始化(static成员不是通过类构造函数进行初始化,而是在定义时初始化)

	Int Myclass::myStaticMer=20;	//需要完全限定 static关键字用于声明不在定义时出现

static数据成员声明为const时,需要在类内初始化,但还需在类外定义

	Static const int period =30;	//类的定义体中初始化,还需在内外定义
	Const int Account::period;	//类外部定义时,不必再指定初始值

?12.6.2.2

位运算

按位异或^

不同为1,相同为0
10100101
01000101
--------------
11100000

按位或|

只要出现1就为1
10100101
01000101
--------------
11100101

按位与&

只要出现0就为0
10100101
01000101
--------------
00000101

~补码,按位取反

只要出现0就为0
10100101
--------------
01011010

<<、>>

0000 0011   <<  3   =  0001 1000
0001 1000   >>  4  =   0000 0001   
posted @ 2019-03-19 18:56  熊云港  阅读(312)  评论(0编辑  收藏  举报