类和对象(上)--关于面向对象,类的定义,访问限定符,this指针

在这里插入图片描述


二次修订于date:2024:3:6

面向对象和面向过程的区别

C语言是一们面向过程的语言,关注的是函数执行的过程,数据和方法是分离的。
C++是一门面向对象的语言,主要关注对象,将一件事情抽象成不同的对象,靠对象间的交互来完成。对象与对象之间的交互叫做消息(举例外卖系统中,分为快递小哥,商家,菜品,用户这几个类,通过这些类创建出各自的对象,通过他们的交互来完成一次外卖行为)

类的定义

关于类的定义这里因为C++是兼容C语言的,所以C++给C语言的struct一个新的定义,就是用来定义类,C语言中关于结构体的用法C++这里同样也是兼容的。

struct name
{
	void Init()
	{
		;
	}
	void Push()
	{
		;
	}

	int* _a;
	int _top;
	int _capacity;
};

定义一个类实际就是一个类型(花括号括起来的就是一个作用域,类的作用域就叫类域),类里面可以定义成员变量_top等,也可以定义成员函数就是Init和Push。name就是类名,成员变量和成员函数组成了类体。

image.png

struct毕竟是C语言的产物,C++还有一个关键字class来定义类

class stu
{
public:
	void Init(const char*arr,const char*id,const char*sex)
	{
		strcpy(_name, arr);
		strcpy(_id, id);
		strcpy(_sex, sex);

	}

	char _name[20];
	char _id[15];
	char _sex[5];
};


int main()
{
	struct stu s;
	s.Init("zhangsan", "0007", "nan");
	return 0;
}

类里面定义实现的函数会被编译器默认当成内联函数。
声明与定义分离如下所示

//main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"stu.h"
int main()
{
	stu s;
	s.Init("zhangsan", "0007", "nan");
	return 0;
}
//stu.h
#pragma once

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

class stu
{
public:
	void Init(const char* arr, const char* id, const char* sex);

	char _name[30];
	char _id[20];
	char _sex[10];
};
//stu.c
#define _CRT_SECURE_NO_WARNINGS
#include"main.h"
void stu::Init(const char* arr, const char* id, const char* sex)
{
	strcpy(_name, arr);
	strcpy(_id, id);
	strcpy(_sex, sex);
}

类的访问限定符和封装

上面代码中的public就是类的访问限定符。

类的访问限定符一共有三个:public,private,protected在此处暂且认为private和protected是相同的。其中public的意思是公有,在public的范围之下(从public出现的地方到下一个访问限定符出现或者到类结束},这段范围都是public)的成员函数或者成员变量是可以在类外被直接访问到的。比如上面代码中的成员函数Init或者成员变量id_[20],可以直接在外面被修改。但是在private或者protected的范围内的成员在类外是不可见的。

//main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"stu.h"
int main()
{
	class stu s;
	s.Init("zhangsan", "0007", "nan");
	return 0;
}
//stu.h
#pragma once

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

class stu
{
public:
	void Init(const char* arr, const char* id, const char* sex);
private:
	char _name[30];
	char _id[20];
	char _sex[10];
};
//stu.c
#define _CRT_SECURE_NO_WARNINGS
#include"main.h"
void stu::Init(const char* arr, const char* id, const char* sex)
{
	strcpy(_name, arr);
	strcpy(_id, id);
	strcpy(_sex, sex);
}

在stu类里面加了一个private,这样就限定类外不能直接访问到成员对象,只能通过成员函数来访问成员对象,好处就是,用户的行为都在掌控之中,不会出现,直接修改成员对象导致某些错误的情况发生。

如果不加类访问限定符,那么struct默认为public(因为struct要兼容C语言的结构体所以是能够随意访问的),class默认为private。
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别(后面的多态,会存在方法突破类域限制)
**【面试题】 **
**问题:C++中struct和class的区别是什么? **
解答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。 和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是的成员默认访问方式是private。

封装

封装实际上是将数据与操作数据的方法结合起来,然后隐藏对象的部分属性和实现细节(一般成员变量都是隐藏的)对外只公开接口,通过接口来对数据进行操作。

封装可以使得数据更加安全,不存在说用户直接去修改对象属性的这种危险行为,用户只能通过调用函数接口来访问对象,行为更加可控。

所以想给外部展示的成员定义为public,不想给外部展示的定义为private或protected。

类的作用域

定义一个类,这个类的大括号就是这个类的作用域,又叫做类域。想要类外实现类成员,就要指定函数属于那个域。

class stack
{
public:
    void Init();
    
    int size;
    int capacity;
    int* a;
};
void stack::Init()
{
    //.....
}

在类外定义类成员就要加stack::。

//stack.cpp
void stack::Init()
{
    .....
}

类的实例化

用定义好的类创建出来对象,这个就叫做类的实例化。

class stack
{
public:
    void Init()
    {
        ;
    }
    void Push()
    {
        ;
    }
private:
    int*_a;
    int _size;
    int _capacity;
};

int main()
{
    stack s1;
    s1.Init();
    s1.Push();
    return 0;
}

用stack创建出来了一个对象s1,这个就是类的实例化。
仅仅定义一个类是不占用内存的,是创建了一个类型,这相当于是一个蓝图,通过这个蓝图可以创建对象,当对象创建出来之后才会在内存中占用空间。
stack::_a为什么不能访问到a?因为stack类型里实际并没有变量a,要等实例化对象之后才存在_a变量。
static类型的成员变量是一个例外。

类对象大小的计算

这里要注意当计算s1的大小的时候,计算出来的大小是12,那么问题来了,成员函数不占内存吗?
image.png

因为实例化出来的对象不包含成员函数,定义类的成员函数都存放在公共的代码段并不是存放在对象中,不然创建多个对象会有很多个重复成员函数,实际应该是多个对象都调用的是同一个成员函数。

class stack
{
public:
    void Init()
    {
        ;
    }
    void Push()
    {
        ;
    }
private:
};

int main()
{
    stack s1;
    cout << sizeof(s1) << endl;
    return 0;
}

如果我们不定义成员变量那么计算的大小会是多少呢?会不会是0?
image.png
不会,如果这个对象的大小是0,那么定义很多个这样的对象,他们的地址也就无法区分开来了。所以不管是空类(什么成员都没有)或者是没有成员变量的类,他们的大小最小是1,这个一个字节的意义就是为了占位,占了一个地址,可以区分不同的对象 。

类的对象的大小计算是和结构体一样的,同样也是遵守内存对齐的。

总结,再来看下面这段代码中的类的大小分别是多少呢?

// 类中既有成员变量,又有成员函数
class A1 {
public:
 void f1(){}
private:
 int _a;
};
// 类中仅有成员函数
class A2 
{
public:
 void f2() {}
};
// 类中什么都没有---空类
class A3
{};

答案:A1创建出来的对象大小是4,A2和A3都是1,所以现在我们也可看出来,对象中不包含成员函数。

关于结构体内存对齐和大小计算

结构体内存对齐规则

  1. 第一个成员在地址偏移量为0的地址处。
  2. 每个成员的第一个字节存放的位置的地址偏移量必须是对齐数整数倍(对齐数:编译器默认对齐数和类型大小之间的较小值)
  3. 默认对齐数(VS中默认为8,默认参数一般设置成1,2,4,8,16。可以通过#pragme pack (4),将编译器的默认对齐数修改为4。如果要恢复编译器默认对齐数,用#pragma pack()即可)
  4. 结构体整体的大小必须是,最大对齐数的整数倍(最大对齐数就是结构体中每个成员对齐数的最大值)
  5. 如果结构体内嵌套了其他结构体变量,那么这个结构体变量也要对齐到其对齐数的整数倍位置,这个结构体变量的对齐数就是它这个结构体的最大对齐数。

注意:只有vs有默认对齐数,其他编译器都是以自身类型大小作为自己的对齐数。

#pragma pack (8)

struct test2
{
    char c;
    double a;
};

int main()
{
    stack s1;
    cout << sizeof(struct test2) << endl;
    return 0;
}

这段程序可以很好的说明最大对齐数,当默认对齐数为1的时候,这大小是9
因为默认对齐数是1,和变量类型中最大的8取较小值就是1.
当默认对齐数为4的时候这个结构体大小为12,8和4取较小的取到了4.
当默认对齐数是8,就没区别了,默认和最大都是8,那结果是16.

**【面试题】 **

  1. 结构体怎么对齐? 为什么要进行内存对齐
  2. 如何让结构体按照指定的对齐参数进行对齐
  3. 如何知道结构体中某个成员相对于结构体起始位置的偏移量
  4. 什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景
    1,为什么要进行内存对齐,这是一种用空间换时间的做法,比如32位机有32根地址线,这样cpu每次读取都可以读取到四个字节,如果结构体成员都堆在一起放置,那么cpu每次读到的数据可能并不是只有一个数据,还可能截断读取了其他数字的部分数据,下次读的时候还需要分两次读取,效率就会很慢,若内存是对齐的,每次读取的数据都是一个数字的数据,就不需要cpu再去处理数据的问题了。
    百度百科对此解释:

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

3,如何知道结构体成员的偏移量呢?

使用宏offsetof(注意这是个宏不是函数),引用的头文件是

#pragma pack (8)
#include<cstddef>
struct test2
{
    char c;
    double a;
};

int main()
{
    stack s1;
    //cout << sizeof(struct test2) << endl;
    cout << offsetof(struct test2, a)<<endl;
    return 0;
}

this 指针

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Init(2022, 6, 17);
	d1.Print();
	return 0;
}

下面我们来思考问题,当我们用不同的对象都调用Print函数和Init函数的时候,这个函数是如何区分形参要赋值给哪一个对象的成员变量呢?
这就是我们要说的this指针

//其实我们在调用Init的时候看似是这样传参
d1.Init(2022,6,17);
//实际上是
d1.Init(&d1,2022,6,17);

d1.Print();
d1.Print(&d1);

在传参的时候实际上还将对象的地址传了过去,只是这些是编译器自己处理的我们看不到而已。下面再来看函数部分是如何实现的。

//实际上的Init是这样的
	void Init(Date*const this,int year, int month, int day)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
//Print也是如此
	void Print(Date*this)
	{
		cout << this->_year << " " << this->_month << " " << this->_day << endl;
	}

就像是C语言中的结构体指针,通过箭头来访问结构体内的对象,这个this指针就是同这种方式访问到每个对象的成员变量。
但是参数上的Data * const this是编译器隐含加上的,不可以手动加上,否则在传参的时候就会出现对应不上的问题。但是我们是可以直接在这个成员函数内使用this指针的,比如下面这样:

	void Init(int year, int month, int day)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}

总结:
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

this指针的特性:

1,this指针的类型是:Date* const this,因为this指针是不可修改的所以用const保护起来。
2,this指针只能在非静态成员函数中使用。
3,this指针是成员函数的一个形参,是对象在调用函数的时候将对象的地址当作实参传递的。所以this指针并不在对象中,而是在存在栈区里面(this指针就是一个指针,一个局部变量)。
4,this指针是成员函数第一个隐含的指针形参,vs编译器通过ecx寄存器自动传递,不需要用户传递。

// 1.下面程序能编译通过吗?
// 2.下面程序会崩溃吗?在哪里崩溃
class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}

	void Show()
	{
		cout << "Show()" << endl;
	}
private:
	int _a;
};

int main()
{
	A* p = NULL;
	p->PrintA();
	p->Show();
}

这段代码可以编译通过,但是执行的时候会挂掉,p->PrintA的时候并没有对空指针进行解引用,虽然这个p指针是空指针,但是调用PrintA函数的时候只是把p当作参数传给了this指针,因为PrintA并不在对象中,所以也不需要对p解引用到对象里面找这个函数,而是需要到公共代码段内找这个函数,因此是可以编译通过的。
程序挂掉的原因是在PrintA中访问_a,实际上是this->_a。这里对空指针进行了解引用,所以程序崩溃了,如果屏蔽掉PrintA则程序没有问题。
注意:PrintA和Show函数的地址并没有存在对象里面。这些成员函数都是存在公共代码段的。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 【出版社】 人民邮电出版社 【书号】 7-115-14554-7 【开本】 16开 【页码】 900 【出版日期】 2006-3-1 【版次】 4-1 【内容简介】 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。本书的前言阐述了 第4版和前一版的不同之处。 【目录信息】 第1章 快速入门 1 1.1 编写简单的C++程序 2 1.2 初窥输入/输出 5 1.2.1 标准输入与输出对象 5 1.2.2 一个使用IO库的程序 5 1.3 关于注释 8 1.4 控制结构 10 1.4.1 while语句 10 1.4.2 for语句 12 1.4.3 if语句 14 1.4.4 读入未知数目的输入 15 1.5 的简介 17 1.5.1 Sales_item 17 1.5.2 初窥成员函数 19 1.6 C++程序 21 小结 22 术语 22 第一部分 基本语言 第2章 变量和基本型 29 2.1 基本内置型 30 2.1.1 整型 30 2.1.2 浮点型 32 2.2 字面值常量 34 2.3 变量 38 2.3.1 什么是变量 39 2.3.2 变量名 40 2.3.3 定义对象 42 2.3.4 变量初始化规则 44 2.3.5 声明和定义 45 2.3.6 名字的作用域 46 2.3.7 在变量使用处定义变量 48 2.4 const限定符 49 2.5 引用 50 2.6 typedef名字 53 2.7 枚举 53 2.8 型 54 2.9 编写自己的头文件 57 2.9.1 设计自己的头文件 58 2.9.2 预处理器的简单介绍 60 小结 62 术语 62 第3章 标准库型 67 3.1 命名空间的using声明 68 3.2 标准库string型 70 3.2.1 string对象的定义和初始化 70 3.2.2 String对象的读写 71 3.2.3 string对象的操作 72 3.2.4 string对象中字符的处理 76 3.3 标准库vector型 78 3.3.1 vector对象的定义和初始化 79 3.3.2 vector对象的操作 81 3.4 迭代器简介 83 3.5 标准库bitset型 88 3.5.1 bitset对象的定义和初始化 88 3.5.2 bitset对象上的操作 90 小结 92 术语 92 第4章 数组和指针 95 4.1 数组 96 4.1.1 数组的定义和初始化 96 4.1.2 数组操作 99 4.2 指针的引入 100 4.2.1 什么是指针 100 4.2.2 指针定义和初始化 101 4.2.3 指针操作 104 4.2.4 使用指针访问数组元素 106 4.2.5 指针和const限定符 110 4.3 C风格字符串 113 4.3.1 创建动态数组 117 4.3.2 新旧代码的兼容 120 4.4 多维数组 122 小结 124 术语 125 第5章 表达式 127 5.1 算术操作符 129 5.2 关系操作符和逻辑操作符 131 5.3 位操作符 134 5.3.1 bitset对象或整型值的使用 135 5.3.2 将移位操作符用于IO 137 5.4 赋值操作符 137 5.4.1 赋值操作的右结合性 138 5.4.2 赋值操作具有低优先级 138 5.4.3 复合赋值操作符 139 5.5 自增和自减操作符 140 5.6 箭头操作符 142 5.7 条件操作符 143 5.8 sizeof操作符 144 5.9 逗号操作符 145 5.10 复合表达式的求值 145 5.10.1 优先级 145 5.10.2 结合性 146 5.10.3 求值顺序 148 5.11 new和delete表达式 150 5.12 型转换 154 5.12.1 何时发生隐式型转换 154 5.12.2 算术转换 155 5.12.3 其他隐式转换 156 5.12.4 显式转换 158 5.12.5 何时需要强制型转换 158 5.12.6 命名的强制型转换 158 5.12.7 旧式强制型转换 160 小结 161 术语 162 第6章 语句 165 6.1 简单语句 166 6.2 声明语句 167 6.3 复合语句(块) 167 6.4 语句作用域 168 6.5 if语句 169 6.6 switch语句 172 6.6.1 使用switch 173 6.6.2 switch中的控制流 173 6.6.3 default标号 175 6.6.4 switch表达式与case标号 176 6.6.5 switch内部的变量定义 176 6.7 while语句 177 6.8 for循环语句 179 6.8.1 省略for语句头的某些部分 180 6.8.2 for语句头中的多个定义 181 6.9 do while语句 182 6.10 break语句 183 6.11 continue语句 184 6.12 goto语句 185 6.13 try块和异常处理 186 6.13.1 throw表达式 186 6.13.2 try块 187 6.13.3 标准异常 189 6.14 使用预处理器进行调试 190 小结 192 术语 192 第7章 函数 195 7.1 函数的定义 196 7.1.1 函数返回型 197 7.1.2 函数形参表 198 7.2 参数传递 199 7.2.1 非引用形参 199 7.2.2 引用形参 201 7.2.3 vector和其他容器型的形参 206 7.2.4 数组形参 206 7.2.5 传递给函数的数组的处理 209 7.2.6 main:处理命令行选项 210 7.2.7 含有可变形参的函数 211 7.3 return语句 211 7.3.1 没有返回值的函数 212 7.3.2 具有返回值的函数 212 7.3.3 递归 216 7.4 函数声明 217 7.5 局部对象 220 7.5.1 自动对象 220 7.5.2 静态局部对象 220 7.6 内联函数 221 7.7 的成员函数 222 7.7.1 定义成员函数的函数体 223 7.7.2 在定义成员函数 225 7.7.3 编写Sales_item的构造 函数 225 7.7.4 代码文件的组织 227 7.8 重载函数 228 7.8.1 重载与作用域 230 7.8.2 函数匹配与实参转换 231 7.8.3 重载确定的三个步骤 232 7.8.4 实参型转换 234 7.9 指向函数的指针 237 小结 239 术语 240 第8章 标准IO库 243 8.1 面向对象的标准库 244 8.2 条件状态 247 8.3 输出缓冲区的管理 249 8.4 文件的输入和输出 251 8.4.1 文件流对象的使用 251 8.4.2 文件模式 254 8.4.3 一个打开并检查输入文件的 程序 256 8.5 字符串流 257 小结 259 术语 259 第二部分 容器和算法 第9章 顺序容器 263 9.1 顺序容器的定义 264 9.1.1 容器元素的初始化 265 9.1.2 容器内元素的型约束 267 9.2 迭代器和迭代器范围 268 9.2.1 迭代器范围 270 9.2.2 使迭代器失效的容器操作 271 9.3 顺序容器的操作 272 9.3.1 容器定义型别名 272 9.3.2 begin和end成员 273 9.3.3 在顺序容器中添加元素 273 9.3.4 关系操作符 277 9.3.5 容器大小的操作 278 9.3.6 访问元素 279 9.3.7 删除元素 280 9.3.8 赋值与swap 282 9.4 vector容器的自增长 284 9.5 容器的选用 287 9.6 再谈string型 289 9.6.1 构造string对象的其他方法 290 9.6.2 修改string对象的其他方法 292 9.6.3 只适用于string型的操作 293 9.6.4 string型的查找操作 295 9.6.5 string对象的比较 298 9.7 容器适配器 300 9.7.1 栈适配器 301 9.7.2 队列和优先级队列 302 小结 303 术语 303 第10章 关联容器 305 10.1 引言:pair型 306 10.2 关联容器 308 10.3 map型 309 10.3.1 map对象的定义 309 10.3.2 map定义型 310 10.3.3 给map添加元素 311 10.3.4 使用下标访问map对象 311 10.3.5 map::insert的使用 313 10.3.6 查找并读取map中的元素 315 10.3.7 从map对象中删除元素 316 10.3.8 map对象的迭代遍历 316 10.3.9 “单词转换”map对象 317 10.4 set型 319 10.4.1 set容器的定义和使用 319 10.4.2 创建“单词排除”集 321 10.5 multimap和multiset型 322 10.5.1 元素的添加和删除 322 10.5.2 在multimap和multiset 中查找元素 323 10.6 容器的综合应用:文本查询程序 325 10.6.1 查询程序的设计 326 10.6.2 TextQuery 327 10.6.3 TextQuery的使用 328 10.6.4 编写成员函数 330 小结 332 术语 332 第11章 泛型算法 335 11.1 概述 336 11.2 初窥算法 339 11.2.1 只读算法 339 11.2.2 写容器元素的算法 341 11.2.3 对容器元素重新排序的算法 343 11.3 再谈迭代器 347 11.3.1 插入迭代器 348 11.3.2 iostream迭代器 349 11.3.3 反向迭代器 353 11.3.4 const迭代器 355 11.3.5 五种迭代器 356 11.4 泛型算法的结构 358 11.4.1 算法的形参模式 359 11.4.2 算法的命名规范 359 11.5 容器特有的算法 361 小结 362 术语 363 第三部分 和数据抽象 第12章  367 12.1 定义和声明 368 12.1.1 定义:扼要重述 368 12.1.2 数据抽象和封装 369 12.1.3 关于定义的更多内容 372 12.1.4 声明与定义 374 12.1.5 对象 375 12.2 隐含的this指针 376 12.3 作用域 380 作用域中的名字查找 382 12.4 构造函数 385 12.4.1 构造函数初始化式 387 12.4.2 默认实参与构造函数 391 12.4.3 默认构造函数 392 12.4.4 隐式型转换 393 12.4.5 成员的显式初始化 396 12.5 友元 396 12.6 static成员 398 12.6.1 static成员函数 400 12.6.2 static数据成员 400 小结 403 术语 403 第13章 复制控制 405 13.1 复制构造函数 406 13.1.1 合成的复制构造函数 409 13.1.2 定义自己的复制构造函数 409 13.1.3 禁止复制 410 13.2 赋值操作符 411 13.3 析构函数 412 13.4 消息处理示例 415 13.5 管理指针成员 419 13.5.1 定义智能指针 421 13.5.2 定义值型 425 小结 427 术语 427 第14章 重载操作符与转换 429 14.1 重载操作符的定义 430 14.2 输入和输出操作符 435 14.2.1 输出操作符<>的重载 437 14.3 算术操作符和关系操作符 439 14.3.1 相等操作符 440 14.3.2 关系操作符 441 14.4 赋值操作符 441 14.5 下标操作符 442 14.6 成员访问操作符 443 14.7 自增操作符和自减操作符 446 14.8 调用操作符和函数对象 449 14.8.1 将函数对象用于标准库算法 450 14.8.2 标准库定义的函数对象 451 14.8.3 函数对象的函数适配器 453 14.9 转换与型 454 14.9.1 转换为什么有用 454 14.9.2 转换操作符 455 14.9.3 实参匹配和转换 458 14.9.4 重载确定和的实参 461 14.9.5 重载、转换和操作符 464 小结 466 术语 467 第四部分 面向对象编程与泛型编程 第15章 面向对象编程 471 15.1 面向对象编程:概述 472 15.2 定义和派生 473 15.2.1 定义 474 15.2.2 protected成员 475 15.2.3 派生 476 15.2.4 virtual与其他成员函数 479 15.2.5 公用、私有和受保护的继承 482 15.2.6 友元关系与继承 486 15.2.7 继承与静态成员 486 15.3 转换与继承 487 15.3.1 派生到基的转换 487 15.3.2 基到派生的转换 489 15.4 构造函数和复制控制 490 15.4.1 基构造函数和复制控制 490 15.4.2 派生构造函数 490 15.4.3 复制控制和继承 494 15.4.4 虚析构函数 495 15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 15.7 容器与继承 503 15.8 句柄与继承 504 15.8.1 指针型句柄 505 15.8.2 复制未知型 507 15.8.3 句柄的使用 508 15.9 再谈文本查询示例 511 15.9.1 面向对象的解决方案 513 15.9.2 值型句柄 514 15.9.3 Query_base 515 15.9.4 Query句柄 516 15.9.5 派生 518 15.9.6 eval函数 520 小结 522 术语 523 第16章 模板与泛型编程 525 16.1 模板定义 526 16.1.1 定义函数模板 526 16.1.2 定义模板 528 16.1.3 模板形参 529 16.1.4 模板型形参 531 16.1.5 非型模板形参 533 16.1.6 编写泛型程序 534 16.2 实例化 535 16.2.1 模板实参推断 537 16.2.2 函数模板的显式实参 540 16.3 模板编译模型 542 16.4 模板成员 545 16.4.1 模板成员函数 548 16.4.2 非型形参的模板实参 551 16.4.3 模板中的友元声明 552 16.4.4 Queue和QueueItem的友元 声明 554 16.4.5 成员模板 556 16.4.6 完整的Queue 558 16.4.7 模板的static成员 559 16.5 一个泛型句柄 560 16.5.1 定义句柄 561 16.5.2 使用句柄 562 16.6 模板特化 564 16.6.1 函数模板的特化 565 16.6.2 模板的特化 567 16.6.3 特化成员而不特化 569 16.6.4 模板的部分特化 570 16.7 重载与函数模板 570 小结 573 术语 574 第五部分 高级主题 第17章 用于大型程序的工具 579 17.1 异常处理 580 17.1.1 抛出型的异常 581 17.1.2 栈展开 582 17.1.3 捕获异常 583 17.1.4 重新抛出 585 17.1.5 捕获所有异常的处理代码 586 17.1.6 函数测试块与构造函数 586 17.1.7 异常层次 587 17.1.8 自动资源释放 589 17.1.9 auto_ptr 591 17.1.10 异常说明 595 17.1.11 函数指针的异常说明 598 17.2 命名空间 599 17.2.1 命名空间的定义 599 17.2.2 嵌套命名空间 603 17.2.3 未命名的命名空间 604 17.2.4 命名空间成员的使用 606 17.2.5 、命名空间和作用域 609 17.2.6 重载与命名空间 612 17.2.7 命名空间与模板 614 17.3 多重继承与虚继承 614 17.3.1 多重继承 615 17.3.2 转换与多个基 617 17.3.3 多重继承派生的复制控制 619 17.3.4 多重继承下的作用域 620 17.3.5 虚继承 622 17.3.6 虚基的声明 624 17.3.7 特殊的初始化语义 625 小结 628 术语 628 第18章 特殊工具与技术 631 18.1 优化内存分配 632 18.1.1 C++中的内存分配 632 18.1.2 allocator 633 18.1.3 operator new函数和 operator delete函数 636 18.1.4 定位new表达式 638 18.1.5 显式析构函数的调用 639 18.1.6 特定的new和delete 639 18.1.7 一个内存分配器基 641 18.2 运行时型识别 646 18.2.1 dynamic_cast操作符 647 18.2.2 typeid操作符 649 18.2.3 RTTI的使用 650 18.2.4 type_info 652 18.3 成员的指针 653 18.3.1 声明成员指针 653 18.3.2 使用成员的指针 655 18.4 嵌套 658 18.4.1 嵌套的实现 658 18.4.2 嵌套作用域中的名字查找 661 18.5 联合:节省空间的 662 18.6 局部 665 18.7 固有的不可移植的特征 666 18.7.1 位域 666 18.7.2 volatile限定符 668 18.7.3 链接指示:extern "C" 669 小结 672 术语 673 附录 标准库 675 索引 703
定义定义的语法格式: •[修饰符] class 名 {….体…..} •体可以由多个属性、方法、构造器组成。 •注意:的修饰符可以是public、final 或省略这两个。名只要是合法的标识符. •一个里可以包含三种最常见的成员:构造器、属性、方法。 定义属性的格式语法 •[修饰符] 属性型 属性名 [= 默认值]; 定义方法的格式语法 •[修饰符] 方法返回值型 方法名(形参列表) {….方法体….} – 方法中的修饰符可以是public ,protected,private,static,final,abstract,其中访问控制符只能出现一 个,abstract ,final 只能出现其一. –返回值型可以是基本型和引用型,如果无返回值,要用void 来声明 –形参列表,可以由零到多组组成,参数之间用逗号(“,”)隔开. –static 是一个特殊的关键字,译为”静态”,所有有static 修饰的叫属性,方法,成员. 定义构造器的语法格式 •[修饰符] 构造器名(形参列表) {……} –修饰符可以是public protected private 构造器必须和名相同,形参和方法的形参一样. 对象的产生和使用 •创建对象的根本途径就是构造器,所以创建对象通过关键字new 加上对应的构造器即可. •如果访问权限允许,定义的属性和方法可以通过或实例来调用, •有static 修饰的访求和属性,既可通过来调用,也可以通过实例来调用. 对象.引用和指针 •Person p = new Person();,这行代码创建了一个Person 实例,也被称为对象,这个对象被赋给了p变量. •也就是说引用型变量里存放的仅仅是一个引用,它指向实际的对象. 对象的this 引用 •this 关键字总是指向调用该方法的对象.   –1.构造器中引用该构造器执行初始化的对象   –2.在方法中引用调用该方法的对象 •在方法里的this 指谁调用就指谁 •注: this 不能用在有static 修饰的方法中. 方法的详解 •方法的所属性   –一旦将一个方法定义在一个里,如果用static 修饰了,这个方法属于这个,否则属于这个的对象.   –方法不能独立执行,必须要有调用者.(如:.方法、对象.方法)   –方法不能独立定义,只能定义里.   –方法要么属于一个,要么属于一个对象 方法的参数传递机制 传递方式只有一种:值传递. 形参长度可变的方法 •如果在定义方法时,在最后一个参数的型后增加三点…,则表明该形参接受多个参数值,多个参数值被当成数组传   入. •长度可变的形参只能位于最后一个参数,并一个方法里只能有一个可变长度的参数. 递归 •递归就是在方法中再次调用自己。 •递归一定要向已知方向递归. 方法的重载 •Java 允许在一个定义多个同名方法,只要形参列表不同即可. •所以方法的重载只要满足两个条件(两同一不同):1.同一个中,方法名相同;2.形参不同。和返回值型无关.   所以在调用这些方法时要传入不同的参数值. 成员变量和局部变量 •成员变量指的是在范围里定义的变量;局部变量指的是在一个方法内定义的变量。 •不管是成员变量还是局部变量都遵守相同的命名规则。 •成员变量分为属性和实例属性.对于属性无论通过还是对象来访问都是访问同一个对象,只要一个对象改变 了属性,那么其他对象对应的属性也改变了.成员变量不用显式初始化,只要定义了一个属性或实例属性,系统 默认进行初始化。 局部变量 •局部变量可分为三种:   –形参   –方法局部变量   –代码块局部变量. •与成员变量不同的是除了形参外,其他局部变量都必须显式地初始化, •Java 里允许局部变量和成员变量重名。这样局部变量会覆盖成员变量,这时通过this 来调用实例的属性. 成员变量的初始化 •当被加载时,成员就在内存中分配了一块空间。 •当对象被创建时,实例成员就在内存中分配了内存空间。 •实例变量与实例共存亡;变量与本身共存亡。 局部变量的运行机制 •局部变量仅在方法内有效。 •当方法执行完成时,局部变量便会自动销毁。 封装 •理解封装:封装是面向对象的三大特征之一。 • 封装包含两方面含义:   –合理隐藏。   –合理暴露。 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ 使用访问控制符 •private 私有的。在同一个里能被访问。 •default 默认的。包访问权限 •protected 受保护的。子中也能访问 •public 公共的。在任何地方都可以访问 package 和 import •package 打包格式:package 包名;放在程序开始的顶端。 •包机制的两个方面的保证。1.源文件里要使用package 语句指定包。2.class 文件必须放在对应的路径下。 •import 引入包格式。分为两种:   –非静态导入,导入的是包下所有的。如:import package.subpackage.*;   –静态导入,导入的是的静态属性。如:import static package.className.*; Java 的常用包 •java.lang.*, •java.util.*, •java.net.* , •java.io.*, •java.text.*, •java.sql.*, •java.awt.*, •java.swing.*. 使用构造器执行初始化 •构造器最大的用处就是在创建对象时执行初始化,系统会默认的进行初始化。 •如果程序员没有Java 提供任何构造器,则系统会为这个提供一个无参的构造器。 •一旦程序员提供了自定义的构造器,遇系统不再提供默认的构造器。 构造器的重载 •构造器的重载和方法的重载一样,都是方法名相同,形参列表不相同。 •在构造器中可通过this来调用另外一个重载的构造器。 继承的特点 •Java通过关键字extends来实现,实现继承的称为子,被继承的称为基、超、父。父是大,子   是小。 •Java的继承是单继承,每个子最多只有一个直接父。 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ 继承 •子继承父的语法格式如下: •修饰符 class subclass extends superclass {。。。。。。} •子扩展了父,将可以获得父的全部属性和方法,但不能获得父构造器 •Java里的继承都是单继承,也就是只能有一个直接的父,可以有n个间接父。 重写父的方法 •方法的重写要遵循“两同两小一大” 指的是:方法名相同,形参列表相同。返回值型更小或相同,抛出的异常更   小或相同,访问控制权限要更大。 父实例的super限定 •通过关键字super 来调用父的方法或属性。 super调用父的构造器 •子构造器总会调用父构造器。 •如果子构造器没有显式使用super调用父构造器;子构造器默认会调用父无参数的构造器。 •创建一个子实例时,总会先调用最顶层父的构造器。 多态性 •Java 引用变量有两个型:一个是编译时的型,一个是运行时的型,编译时的型由声明该变量时使用的   型决定,运行时的型由实际赋给该变量的对象决定。 •如果编译时型和支行时的型不一致,这就有可能出现所谓的多态。 •两个相同型的引用变量,由于它们实际引用的对象的型不同,当它们调用同名方式时,可能呈现出多种行为   特征,这就是多态。 引用变量的型转换 •将一个子对像赋给父,这就是向上转型。向上转型是自动的。 •强制型转换: 型转换运算符是小括号,语法如下(type)variable; instanceof运算符 •前一个操作通常是一个引用型的变量,后一个操作通常是一个(也可以是接   口)。如果是 返回true, 否返回false。 继承和组合 •使用继承的注意点 •利用组合实现复用:总之,继承要表达的是一种“是(is-a)”的关系,而组合表达的是”有(has-a)“的关系。 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ 初始化块 •使用初始化块:初始化块由大括号括起{…},只能由static修饰。 •初始化块和构造器:初始化块总在构造器之前执行,初始化块不能接受形参。 静态初始化块 •用static修饰的初始化块为静态初始化块,由于是静态的,所以是属于,当加载时,就执行静态初始化块 ,   但执行一个子时,最先执行其最顶层父的静态初始化, •初始化块是属于实例 的。只要创建一次对象,初始化块就执行一次。 下面贴出代码: Dog DogTest Person PersonTest ReturnThis StaticAccessNonStatic ThisInConstructor Overload OverloadVarargs PrimitiveTransferTest Recursive ReferenceTransferTest Varargs 复制代码 public class BlockTest { public static void main(String[] args) { { // 定义一个代码块局部变量a int a; // 下面代码将出现错误,因为a变量还未初始化 // System.out.println("代码块局部变量a的值:" + a); // 为a变量赋初始值,也就是进行初始化 a = 5; System.out.println("代码块局部变量a的值:" + a); } // 下面试图访问的a变量并不存在 // System.out.println(a); } // 代码块局部变量a的值:5 } 复制代码 。。。。。。。。。。。。。。。。。。。
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1   1.1 编写一个简单的C++程序 2   1.1.1 编译、运行程序 3   1.2 初识输入输出 5   1.3 注释简介 8   1.4 控制流 10   1.4.1 while语句 10   1.4.2 for语句 11   1.4.3 读取数量不定的输入数据 13   1.4.4 if语句 15   1.5 简介 17   1.5.1 Sales_item 17   1.5.2 初识成员函数 20   1.6 书店程序 21   小结 23   术语表 23   第Ⅰ部分 C++基础 27   第2章 变量和基本型 29   2.1 基本内置型 30   2.1.1 算术型 30   2.1.2 型转换 32   2.1.3 字面值常量 35   2.2 变量 38   2.2.1 变量定义 38   2.2.2 变量声明和定义的关系 41   2.2.3 标识符 42   2.2.4 名字的作用域 43   2.3 复合型 45   2.3.1 引用 45   2.3.2 指针 47   2.3.3 理解复合型的声明 51   2.4 const限定符 53   2.4.1 const的引用 54   2.4.2 指针和const 56   2.4.3 顶层const 57   2.4.4 constexpr和常量表达式 58   2.5 处理型 60   2.5.1 型别名 60   2.5.2 auto型说明符 61   2.5.3 decltype型指示符 62   2.6 自定义数据结构 64   2.6.1 定义Sales_data型 64   2.6.2 使用Sales_data 66   2.6.3 编写自己的头文件 67   小结 69   术语表 69   第3章 字符串、向量和数组 73   3.1 命名空间的using声明 74   3.2 标准库型string 75   3.2.1 定义和初始化string对象 76   3.2.2 string对象上的操作 77   3.2.3 处理string对象中的字符 81   3.3 标准库型vector 86   3.3.1 定义和初始化vector对象 87   3.3.2 向vector对象中添加元素 90   3.3.3 其他vector操作 91   3.4 迭代器介绍 95   3.4.1 使用迭代器 95   3.4.2 迭代器运算 99   3.5 数组 101   3.5.1 定义和初始化内置数组 101   3.5.2 访问数组元素 103   3.5.3 指针和数组 105   3.5.4 C风格字符串 109   3.5.5 与旧代码的接口 111   3.6 多维数组 112   小结 117   术语表 117   第4章 表达式 119   4.1 基础 120   4.1.1 基本概念 120   4.1.2 优先级与结合律 121   4.1.3 求值顺序 123   4.2 算术运算符 124   4.3 逻辑和关系运算符 126   4.4 赋值运算符 129   4.5 递增和递减运算符 131   4.6 成员访问运算符 133   4.7 条件运算符 134   4.8 位运算符 135   4.9 sizeof运算符 139   4.10 逗号运算符 140   4.11 型转换 141   4.11.1 算术转换 142   4.11.2 其他隐式型转换 143   4.11.3 显式转换 144   4.12 运算符优先级表 147   小结 149   术语表 149   第5章 语句 153   5.1 简单语句 154   5.2 语句作用域 155   5.3 条件语句 156   5.3.1 if语句 156   5.3.2 switch语句 159   5.4 迭代语句 165   5.4.1 while语句 165   5.4.2 传统的for语句 166   5.4.3 范围for语句 168   5.4.4 do while语句 169   5.5 跳转语句 170   5.5.1 break
C.参考大全第四版 本书是根据著名C语言专家HerbertSchildt的著作翻译的。这是一本关于C++语言的百科全书,包括C和C++的命令、功能、编程和应用等方面的内容。全书分为五个部分:C++基础:C子集;C++的专有特征;标准函数库;标准C++库;C++应用程序范例。详细描述和演示了定义C++语言的关键字、语法、函数、和特征。其中第一部分全面讨论了C++的C子集;第二部分详细介绍了C++本身的特性,如类和对象、构造函数、析构函数和模板等;第三部分描述了标准函数库;第四部分讨论了标准库,包括STL(标准模板库);第五部分显示了两个应用C++面向对象编程的实际例子。 本书内容全面、翔实,是学习C++编程语言的广大学生的一部有用的工具书,也是对C++感兴趣的读者的必备参考书。 第一部分 C++基础:C子集 第1章 C语言概述 1.1 C语言的起源和历史 1.2 C语言是中级语言 1.3 C语言是结构化语言 1.4 C语言是程序员的语言 1.5 C程序的结构 1.6 库和链接 1.7 分别编译 1.8 理解.C和.CPP文件扩展 第2章 表达式 2.1 五种基本数据型 2.2 修饰基本型 2.3 标识符名称 2.4 变量 2.5 const和volatile限定符 2.6 存储限定符 2.7 变量初始化 2.8 常量 2.9 运算符 2.10 表达式 第3章 语句 3.1 C和C++中的真值和假值 3.2 选择语句 3.3 迭代语句 3.4 在选择和迭代语句内声明变量 3.5 跳转语句 3.6 表达式语句 3.7 块语句 第4章 数组和以null结束的字符串 4.1 一维数组 4.2 生成指向数组的指针 4.3 向函数传递一维数组 4.4 以null结束的字符串 4.5 二维数组 4.6 多维数组 4.7 带下标的指针 4.8 数组初始化 4.9 棋盘游戏实例 第5章 指针 5.1 什么是指针 5.2 指针变量 5.3 指针运算符 5.4 指针表达式 5.5 指针和数组 5.6 多级间址 5.7 初始化指针 5.8 指向函数的指针 5.9 C语言的动态分配函数 5.10 指针应用中的问题 第6章 函数 6.1 函数的一般形式 6.2 数作用域的规则 6.3 函数变元 6.4 传给main()的变元argc和argv 6.5 return语句 6.6 递归 6.7 函数原型 6.8 声明变长参数列表 6.9 传统的与现代的函数参数声明 第7章 结构、联合、枚举和用户定义型 7.1 结构 7.2 结构数组 7.3 向函数传递结构 7.4 结构指针 7.5 结构中的数组和结构 7.6 位域 7.7 联合 7.8 枚举 7.9 用sizeof来保证可移植性 7.10 typedef 第8章 C风格的控制台I/O 8.1 一个重要的应用说明 8.2 读写字符 8.3 读写字符串 8.4 格式化的控制台I/O 8.5 printf() 8.6 scanf() 第9章 文件I/O 9.1 C与C++的文件I/O 9.2 流和文件 9.3 流 9.4 文件 9.5 文件系统基础 9.6 fread()和fwrite() 9.7 fseek()和随机访问I/O 9.8 fprintf()和fscanf() 9.9 标准流 第10章 预处理器和注释 10.1 预处理器 10.2 #define 10.3 #error 10.4 #include 10.5 条件编译指令 10.6 #undef 10.7 使用defined 10.8 #line 10.9 #pragma 10.10 #和##预处理器运算符 10.11 预定义的宏名 10.12 注释 第二部分 C++的专有特征 第11章 C++语言概述 11.1 C++的起源 11.2 什么是面向对象的程序设计 11.3 C++基础 11.4 老的C++与现代C++ 11.5 C++ 11.6 函数重载 11.7 运算符重载 11.8 继承 11.9 构造函数和析构函数 11.10 C++的关键字 11.11 C++程序的一般形式 第12章 类和对象 12.1 12.2 结构和是相互关联的 12.3 联合和是相互关联的 12.4 友元函数 12.5 友元 12.6 内联函数 12.7 在定义内联函数 12.8 带参数的构造函数 12.9 带一个参数的构造函数:特例 12.10 静态成员 12.11 何时执行构造函数和析构函数 12.12 作用域分辨符 12.13 嵌套 12.14 局部 12.15 向函数传递对象 12.16 返回对象 12.17 对象赋值 第13章 数组、指针、引用和动态分配运算符 13.1 对象数组 13.2 指向对象的指针 13.3 C++指针型检查 13.4 this指针 13.5 指向派生型的指针 13.6 指向成员的指针 13.7 引用 13.8 格式问题 13.9 C++的动态分配运算符 第14章 函数重载、拷贝构造函数和默认变元 14.1 函数重载 14.2 重载构造函数 14.3 拷贝构造函数 14.4 查找重载函数的地址 14.5 重载的过去与现在 14.6 默认的函数变元 14.7 函数重载和二义性 第15章 运算符重载 15.1 创建成员运算符函数 15.2 使用友元函数的运算符重载 15.3 重载new和delete 15.4 重载某些特殊运算符 15.5 重载逗号运算符 第16章 继承 16.1 基访问控制 16.2 继承和保护成员 16.3 继承多个基 16.4 构造函数、析构函数和继承 16.5 准许访问 16.6 虚基 第17章 虚函数与多态性 17.1 虚函数 17.2 继承虚属性 17.3 虚函数是分层的 17.4 纯虚函数 17.5 使用虚函数 17.6 早期绑定与后期绑定 第18章 模板 18.1 通用函数 18.2 应用通用函数 18.3 通用 18.4 关键字typename和export 18.5 模板的功用 第19章 异常处理 19.1 异常处理基础 19.2 处理派生异常 19.3 异常处理选项 19.4 理解terminate()和unexpected() 19.5 uncaught_exception()函数 19.6 exception和bad_exception 19.7 异常处理的应用 第20章 C++输入/输出系统基础 20.1 老的C++I/O与现代的C++I/O 20.2 C++的流 20.3 C++的流 20.4格式化的I/O 20.5 重载 第21章 C++文件的输入/输出 21.1 和文件 21.2 打开和关闭文件 21.3 读写文本文件 21.4 无格式和二进制I/O 21.5 其他get()函数 21.6 getline()函数 21.7 检测EOF 21.8 ignore()函数 21.9 peek()和putback()函数 21.10 flush()函数 21.11 随机访问 21.12 I/O状态 21.13 定制的I/O和文件 第22章 运行时型标识与强制转换运算符 22.1 运行时型标识 22.2 强制转换运算符 22.3 dynamic_cast 第23章 名字空间、转换函数和其他高级主题 23.1 名字空间 23.2 std名字空间 23.3 创建转换函数 23.4 const成员函数与mutable 23.5 volatile成员函数 23.6 explicit构造函数 23.7 成员初始化语法 23.8 利用关键字asm 23.9 连接说明 23.10 基于数组的I/O 23.11 C与C++的区别 第24章 标准模板库 24.1 STL概述 24.2 容器 24.3 一般的操作原理 24.4 vector容器 24.5 list容器 24.6 map容器 24.7 算法 24.8 使用函数对象 24.9 string 24.10 关于STL的最后一点说明 第三部分 标准函数库 第25章 基子C的输入/输出函数 25.1 clearerr函数 25.2 fclose函数 25.3 feof函数 25.4 ferror函数 25.5 fflush函数 25.6 fSetc函数 25.7 fgetpos函数 25.8 fSets函数 25.9 fopen函数 25.10 fprintf函数 25.11 fputc函数 25.12 fputs函数 25.13 fread函数 25.14 freopen函数 25.15 fscmff函数 25.16 fseek函数 25.17 fsetpos函数 25.18 ftell函数 25.19 fwrite函数 25.20 gete函数 25.21 getchar函数 25.22 gets函数 25.23 perror函数 25.24 prinff函数 25.25 putc函数 25.26 putchar函数 25.27 puts函数 25.28 remove函数 25.29 rename函数 25.30 rewind函数 25.31 scanf函数 25.32 setbuf函数 25.33 setvbuf函数 25.34 sprinff函数 25.35 sscanf函数 25.36 tmpfile函数 25.37 tmpnam函数 25.38 ungetc函数 25.39 vpfintf,vfpfintf和vsprintf函数 第26章 字符串与字符函数 26.1 isalnum函数 26.2 isalpha函数 26.3 iscntrl函数 26.4 isdiSit函数 26.5 isgraph函数 26.6 islower函数 26.7 isprint函数 26.8 ispunct函数 26.9 isspace函数 26.10 isupper函数 26.11 isxdiSit函数 26.12 memchr函数 26.13 memcmp函数 26.14 memcpy函数 26.15 memmove函数 26.16 memset函数 26.17 strcat函数 26.18 strchr函数 26.19 strcmp函数 26.20 strcoll函数 26.21 strcpy函数 26.22 strcspn函数 26.23 strerror函数 26.24 strlen函数 26.25 strncat函数 26.26 stmcmp函数 26.27 strncpy函数 26.28 strpbrk函数 26.29 strrchr函数 26.30 strspn函数 26.31 strstr函数 26.32 strtok函数 26.33 strxfrm函数 26.34 tolower函数 26.35 toupper函数 第27章 数学函数 27.1 acos函数 27.2 asin函数 27.3 atan函数 27.4 atan2函数 27.5 ceil函数 27.6 COS函数 27.7 cosh函数 27.8 exp函数 27.9 fabs函数 27.10 floor函数 27.11 fmod函数 27.12 kexp函数 27.13 ldexp函数 27.14 log函数 27.15 loglO函数 27.16 modf函数 27.17 pow函数 27.18 sin函数 27.19 sinh函数 27.20 sqrt函数 27.21 tan函数 27.22 tanh函数 第28章 时间、日期和定位函数 28.1 asctime函数 28.2 clock函数 28.3 ctime函数 28.4 difftime函数 28.5 gmtime函数 28.6 localeeonv函数 28.7 localtime函数 28.8 mktime函数 28.9 setlocale函数 28.10 strftime函数 28.11 time函数 第29章 动态分配函数 29.1 calloc函数 29.2 free函数 29.3 malloc函数 29.4 realloe函数 第30章 实用函数 30.1 abort函数 30.2 abs函数 30.3 assert函数 30.4 atexit函数 30.5 atof函数 30.6 atoi函数 30.7 atol函数 30.8 bsearch函数 30.9 div函数 30.10 exit函数 30.11 getenv函数 30.12 labs函数 30.13 ldiv函数 30.14 longjmp函数 30.15 mblen函数 30.16 mbstowes函数 30.17 mbtowc函数 30.18 qsort函数 30.19 raise函数 30.20 rand函数 30.21 setjmp函数 30.22 signal函数 30.23 srand函数 30.24 strtod函数 30.25 strtol函数 30.26 strtoul函数 30.27 system函数 30.28 va_arg,va_start和va end函数. 30.29 wcstombs函数 30.30 wctomb函数 第31章 宽字符函数 31.1 宽字符分函数 31.2 宽字符I/O函数 31.3 宽字符串函数 31.4 宽字符串转换函数 31.5 宽字符数组函数 31.6 多字节/宽字符转换函数 第四部分 标准C++库 第32章 标准C++I/O 32.1 I/O 32.2 I/O头文件 32.3 格式化标记和I/O操作算子 32.4 几个数据型 32.5 重载运算符 32.6 通用的I/O函数 第33章 STL容器 33.1 容器 第34章 STL算法 34.1 adjacent_find 34.2 binary_search 34.3 copy 34.4 copy_backward 34.5 count 34.6 count_if 34.7 equal 34.8 equal_range 34.9 flll和fill_n 34.10 find 34.11 find_end 34.12 find_first_of 34.13 find_if 34.14 for_each 34.15 generate和generate_n 34.16 includes 34.17 inplace_merge 34.18 iter_swap 34.19 lexicographical_compare 34.20 lower_bound 34.21 make_heap 34.22 max 34.23 max_element 34.24 merge 34.25 min 34.26 min_element 34.27 mismatch 34.28 next_permutation 34.29 nth_element 34.30 partial sort 34.31 partial sort_copy 34.32 partition 34.33 pop_heap 34.34 prev_permutation 34.35 push_heap 34.36 random_shuffle 34.37 remove,remove_if,remove copy和remove_copy_if 34.38 replace,replace_copy,replace_if和replace_copy_if 34.39 reverse和reverse_copy 34.40 rotate和rotate_copy 34.41 search 34.42 search_n 34.43 set_difference 34.44 set_intersection 34.45 set_symmetric_difference 34.46 set_union 34.47 sort 34.48 sort_heap 34.49 stable_partition 34.50 stable_sort 34.51 swap 34.52 swap_ranges 34.53 transform 34.54 unique和unique_copy 34.55 upper_bound 第35章 STL迭代器、分配器和函数对象 35.1 迭代器 35.2 函数对象 35.3 分配器 第36章 字符串 36.1 basic_string 36.2 char_traits 第37章 数字 37.1 complex 37.2 valarray 37.3 数字算法 第38章 异常处理和杂项 38.1 异常 38.2 auto_ptr 38.3 pair 38.4 本地化 38.5 其他有趣的 第五部分 C++应用程序范例 第39章 集成新的:自定义字符串 39.1 StrType 39.2 构造函数和析构函数 39.3 字符串I/O 39.4 赋值函数 39.5 连接 39.6 子字符串减法 39.7 关系运算符 39.8 各种字符串函数 39.9 完整的StrType 39.10 使用StrType 39.11 创建和集成新型 39.12 挑战 第40章 分析表达式 40.1 表达式 40.2 分析表达式:问题 40.3 分析一个表达式 40.4 parser 40.5 剖析一个表达式 40.6 一个简单的表达式分析器 40.7 向分析器中添加变量 40.8 递归下降分析器中的语法检查 40.9 构建一个通用的分析器 40.10 需要试验的一些东西 附录A C++的.NET可管理扩展 附录B C++和机器人时代

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KissKernel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值