C++读书笔记

1.类和对象

  C++时C的扩展

 

 const限定符:C语言中是一个不能改变值的变量,const int g_nBufSize;

               C++中是一个有类型描述的常量,constint g_nBufSize = 15;

 

 const定义的常量有类型,而define定义的没有类型,编译可以对前者进行类型安全检查,const在编译时分配内存,define只是简单的替换,不分配内存。

 

  C++申请堆空间的是new与delete运算符

  int*pBuf = new int[15];

  int*pNum = new int(‘f’);

 

  C++中可以给形参赋默认值

 

  引用即别名,与原变量地址完全一样,初始化后不可修改

 

 cosnt引用指向const对象的引用,普通的无法引用const型数据

 

  C++中4种不同的转换方式:const_cast:常量类型转换,主要用于去除cosnt属性,static_cast:静态类型转换,主要用于做强制类型转换,reinterpret_cast:重定义类型转换,将目标变量按照其转换类型重新定义解释并进行操作,dynamic_cast:动态类型转换

 

  C++输入输出:dec 十进制输出,

hex16进制输出,

oct八进制输出,

setfill(c)设置填充字符,

setprecision(n)设置显示小数精度为n位

setw(n)设置域宽为n个字符,

setiosflags(ios::fixed)小数方式表示

setiosflags(ios::scientific)指数方式表示

setiosflags(ios::left)左对齐方式表示

setiosflags(ios::right)右对齐方式表示

 

2.类的定义,声明,应用

  Clss类名

{

数据权限:

    成员函数

    成员变量

}

 

对象成员引用:对象名.成员 对象名指针->成员

 

成员函数定义:类体,类外,不同文件定义。

 

成员函数调用:通过对象调用,通过指针调用,通过引用调用

成员函数在内存中并不是和成员变量存放在一起,每个对象会单独分配对应的空间和对应的地址,每个对象也都有自己的this指针,并指向对象的首地址,通过eax寄存器保存该对象首地址,通过对象名调用对应的成员变量(编译器实际上是隐式调用了this指针),即是通过地址找到对应的变量。

成员函数的代码是放在代码区,在调用构造函数申请对象后,会保存一个跳转地址应该是一个跳转表;调用成员函数,通过寄存器ecx取到对象的首地址,通过偏移找到成员函数的这个地址,在调用成员函数时会隐式调用this指针,构造函数也可以看作是对象的成员函数,也是thiscall调用方式,所以只能是怀疑是成员函数

this指针:在每个类的成员函数中,都隐含了一个this指针,该指针指向正在调用成员函数的对象。

 

局部对象:作用域是局部的

全局对象:作用域在整个程序生命周期

静态对象:分内部静态对象和外部静态对象,生命周期是全局,前者作用域函数体内,后者为文件

 

3.构造与析构

  构造函数:初始化对象

  析构函数:释放对象空间

  撤销顺序:先构造后析构

 

  带参构造:利用参数化列表进行初始化

 

  转换构造函数的作用是将一个其他类型的数据转化成一个类的对象,当一个构造函数只有一个参数,而且该参数又不是奔雷的cosnt引用时,这种构造函数称为转换构造函数。

 

  在单个参数的构造函数之前加上explicit关键字,就会阻止转换构造,同时也阻止了在定义对象时使用的等号初始化对象

 

  当使用赋值运算符时会调用赋值构造函数

 

  缺省构造函数:当类中没有时会调用缺省构造函数。

 

  拷贝构造函数:用一个对象的值创建并初始化另一个对象的方法,完成该功能的是拷贝构造函数,格式:

  类名::拷贝构造函数名(类名 & 引用名)

{

}

其中,函数名同类名,没有返回类型,只用一个形参,且 是该类型的对象的引用。

在进行函数参数传递时,实参对象传递给形参对象,会调用拷贝构造函数,作为返回值时会调用拷贝构造函数创建一个临时对象,然后再将临时对象值给接收函数返回值的对象。

 

4.静态成员

  静态数据成员:一处更改,将影响相关对象。

 

  静态成员函数:类名::静态成员函数名(参数列表)或 对象名.静态成员函数名(参数列表),属于类,不属于任何对象,静态成员函数中可以直接使用静态成员函数,可以通过对象来使用非静态成员

 

5.友元

  类具有分装性,友元机制不通过调用成员函数直接访问类的私用数据,调高运行效率。

 

  友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限,友元不是类的成员不受访问权限控制,

 

6.运算符重载

  不能被重载的运算符有:?:

                        ->

                        .

                        ::

                        Sizeof

  重载优先级和结合性不变,操作数个数不变,语法结构不变

 

  通过定义一个函数来实现的,运算符符合使用习惯便于理解,运算符重载不能创造新的运算符

 

  成员函数运算符重载:函数类型 类名::operator 符号 (参数列表){}

 

  友元函数运算符重载:friend函数类型 operator 符号(参数列表){}

 

  一元运算符:对象.operator符号(),或者operator符号(对象)

  二元运算符:对象.operator符号(对象B),或者opertor符号(对象A,对象B)

 

7.派生继承

  访问权限:publicprivate protected

  构造顺序:先构造父类

  析构顺序:先析构子类

  重定义:子类修改成员功能时扩展或改写父类的成员函数

  多继承易导致二义性,因此将基类定义为虚基类,在内存中则只保留一份副本。

 

8.多态性,虚函数

  函数重载:函数名相同,参数个数,类型都不同。

  虚函数与多态性

  虚表指针,保存着函数的地址

 

  静态联编,直接写入函数地址

  动态联编,通过动态获取函数地址,对象地址-》虚表地址-》函数地址,

           使用父类对象指针,指向子类对象,然后调用指针。

           虚基类定义指针,不能实例化对象

           

  虚析构函数,当基类指针释放时,不会调用子类析构函数,则会导致内存泄露,

              因此将基类析构函数声明为虚析构函数,则调用子类析构函数释放资源。

             

  抽象类,虚函数() =0;  //纯虚函数

 

 

9.模板

  函数模板定义方式

 template <typename T>

 void swap(T &left, T&right)

  {

  ...

  }

  实例化:

 swap<int>(int , int );

 

  类模板定义方式

 template <typename T>

 class CStack

  {

  ...

  }

  定义在.h中

 void 类<T>::push(const T&data)

  {

  ...

  }

 

10.C++异常处理机制

   try

{

}

catch()

{

}

  

 ex1

/************************************************************************/
/* 1.编写一个程序,输出下图所示的结果
		    1
		   121
		  12321
		 1234321
		123454321
	       12345654321
*/
/************************************************************************/
#include "stdafx.h"
#include <iostream>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 12; j++)
		{
			if (j < 6 -i || j > 6 + i)
			{
				cout << " ";
			}
			else
			{
				cout << i - abs(j - 6) + 1;
			}
		}
		cout << endl;
		
	}
	return 0;
}


 ex2.

/************************************************************************/
/* 2.定义一个人类,包含有姓名,年龄,身高,体重,健康指数五个量,
	 健康指数 = 体重 / (身高)^3 (公斤,米)
	 请在堆空间申请10个对象,要求为10个对象分别输入姓名,年龄,身高,
	 体重。之后遍历输出每个对象的姓名,年龄,健康指数,注意考虑内存泄露。
*/
/************************************************************************/
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class HumanClass
{
public:
	HumanClass();
	void setHuman(char *strName, int nAge, float fHigh, float fFat);
	~HumanClass();
	char *getstrName();
	int getAge();
	float getfHigh();
	float getFat();
	float getfHealthy();

	void setstrName(char *strName);
	void setAge(int nAge);
	void setfHight(float fHigh);
	void setFat(float fFat);


private:

	char *strName;
	int nAge;
	float fHigh;
	float fFat;
	float fHealthy;
};

void HumanClass::setHuman(char *strName, int nAge, float fHigh, float fFat)
{
	this->strName = strName;
	this->nAge = nAge;
	this->fHigh = fHigh;
	this->fFat = fFat;
	this->fHealthy = fFat / (fHigh * fHigh * fHigh);
}

HumanClass::~HumanClass()
{
}

char *HumanClass::getstrName()
{
	return strName;
}

int HumanClass::getAge()
{
	return nAge;
}

float HumanClass::getfHigh()
{
	return fHigh;
}
float HumanClass::getFat()
{
	return fFat;
}
float HumanClass::getfHealthy()
{
	return fHealthy;
}
HumanClass::HumanClass()
{

}

void HumanClass::setstrName(char *strName)
{
	this->strName = strName;
}

void HumanClass::setAge(int nAge)
{
	this->nAge = nAge;
}

void HumanClass::setfHight(float fHigh)
{
	this->fHigh = fHigh;
}

void HumanClass::setFat(float fFat)
{
	this->fFat = fFat;
}



int _tmain(int argc, _TCHAR* argv[])
{
	char strName[10] = {'\0'};
	int nAge;
	float fHigh;
	float fFat;
	HumanClass *hc = new HumanClass[10];
	//HumanClass *hTmp;
	for (int i = 0; i < 10; i++)
	{
		cout << i + 1 << ") " << "name:";
		cin >> strName;
		cout << endl << "nAge:";
		cin >> nAge;
		cout << endl << "fHigh:";
		cin >> fHigh;
		cout << endl << "fFat:";
		cin >> fFat;
		
		hc[i].setHuman(strName, nAge, fHigh, fFat);
		
	}

	for (int i = 0; i < 10; i++)
	{
		cout << i + 1 << ") name:" << hc[i].getstrName();
		cout << "\tAge:" << hc[i].getAge();
		cout << "\tHealthy:" << hc[i].getfHealthy() << endl;
	}
	
	delete hc;
	hc = NULL;

	return 0;
}


 ex3.

/************************************************************************/
/*3. 设计一个类CTime类,要求其满足下述要求。
有带参数构造函数
该类中包含表示时间的时,分,秒
设置该类中的时分秒的函数,
获取该类中时分秒的三个函数:GetHour(),GetMinute()和GetSecond()
*/
/************************************************************************/
#include "stdafx.h"
#include <iostream>
using namespace std;

class CTime
{
public:
	CTime();
	void setHour(int nHour);
	void setMinute(int nMinute);
	void setSecond(int nSecond);
	int GetHour();
	int GetMinute();
	int GetSecond();
protected:
private:
	int nHour;
	int nMinute;
	int nSecond;
};

CTime::CTime()
{

}
void CTime::setHour(int nHour)
{
	this->nHour = nHour;
}
void CTime::setMinute(int nMinute)
{
	this->nMinute = nMinute;
}
void CTime::setSecond(int nSecond)
{
	this->nSecond = nSecond;
}
int CTime::GetHour()
{
	return nHour;
}
int CTime::GetMinute()
{
	return nMinute;
}
int CTime::GetSecond()
{
	return nSecond;
}

int _tmain(int argc, _TCHAR* argv[])
{
	CTime ct;
	int nHour;
	int nMinute;
	int nSecond;
	cin >> nHour;
	cin >> nMinute;
	cin >> nSecond;
	ct.setHour(nHour);
	ct.setMinute(nMinute);
	ct.setSecond(nSecond);
	ct.GetHour();
	ct.GetMinute();
	ct.GetSecond();
	cout << ct.GetHour() << ":" << ct.GetMinute() << ":" << ct.GetSecond() << endl;
	return 0;
}


 ex4.

/************************************************************************/
/* 4.继承COORD(控制台编程中使用的结构体),并添加一些成员函数,例如:
     为这个新类添加  ++  运算符重载 (前置 ++ 使X坐标加一,后置++使Y坐标加一)
	          添加  --  运算符重载(前置 -- 使X坐标减一,后置--使Y坐标减一)
			  添加一个表示方向的成员变量,并添加朝当前方向移动一步的成员函数:
			  void MoveStep();
*/
/************************************************************************/
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;

class MyCOORD : public COORD
{
public:

	int operator++();
	int operator++(int Y);
	int operator--();
	int operator--(int Y);
	void MoveStep();
	COORD getDicUp();
	void setDicUp(COORD m_dicUp);
protected:
private:
	COORD m_DirectUp;
};

int MyCOORD::operator++()//前置
{
	++X;
	return X;
}

int MyCOORD::operator++(int Y)//后置
{
	++Y;
	
	return Y;
}

int MyCOORD::operator--()
{
	--X;
	return X;
}
int MyCOORD::operator--(int Y)
{
	Y--;
	return Y;
}
void MyCOORD::MoveStep()
{
	m_DirectUp.Y++;

}

COORD MyCOORD::getDicUp()
{
	return m_DirectUp;
}
void MyCOORD::setDicUp(COORD m_dicUp)
{
	this->m_DirectUp = m_dicUp;
}
int _tmain(int argc, _TCHAR* argv[])
{
	MyCOORD mc;
	COORD cd;
	cd.X = 10;
	cd.Y = 10;
	mc.setDicUp(cd);
	cout << "位置:";
	cout << "(" << mc.getDicUp().X << "," << mc.getDicUp().Y << ")" << endl;

	mc.MoveStep();
	cout << "向上移动一步:";
	cout << "(" << mc.getDicUp().X << "," << mc.getDicUp().Y << ")" << endl;
	return 0;
}


 ex5.

/************************************************************************/
/*5. 编写一个程序,设计一个汽车类vehicle,包含的数据成员有车轮个数wheels和车重weight
     小车类car是vehicle的私有派生类其中包含载人数passenger_load
	 卡车类truck是vehicle的私有派生类其中包含在人数passenger_load和载重量payload
	 每个类都有相关数据的输出方法。
*/
/************************************************************************/
#include "stdafx.h"

#include <iostream>
using namespace std;
class vehicle
{
public:
	vehicle(){}
	vehicle(int wheels, int weight) : wheels(wheels), weight(weight){}
	void ShowWheels()
	{
		cout << "vehicle -> wheels: " << wheels << endl;
	}
	void ShowWeight()
	{
		cout << "vehicle -> weight: " << weight << endl;
	}
protected:
private:
	int wheels;
	int weight;
};

class car : private vehicle
{
public:
	car(int passenger_load) : passenger_load(passenger_load){}
	void ShowPassengerLoadcar()
	{
		cout << "car -> passenger_load: " << passenger_load << endl;
	}
protected:
private:
	int passenger_load;

};

class truck : private vehicle
{
public:
	truck(int passenger_load, int payload) : passenger_load(passenger_load), payload(payload){}
	void ShowPassengerLoadtruck()
	{
		cout << "truck -> passenger_load: " << passenger_load << endl;
	}
	void ShowPayLoad()
	{
		cout << "truck -> payload: " << payload << endl;
	}
protected:
private:
	int passenger_load;
	int payload;
};
int _tmain(int argc, _TCHAR* argv[])
{
	vehicle vc(4, 200);
	car c(50);
	truck t(30, 200);
	vc.ShowWeight();
	vc.ShowWheels();
	c.ShowPassengerLoadcar();
	t.ShowPassengerLoadtruck();
	t.ShowPayLoad();
	return 0;
}


 ex6.

/************************************************************************/
/*6. 编写一个学生和教师数据输入和显示程序
     学生数据有编号,姓名,班号和成绩
	 教师数据有编号,姓名,职称和部门
	 要求将编号,姓名的输入和显示设计成一个类person,并作为学生数据操作类
	 student和教师数据操作类teacher的基类
*/
/************************************************************************/
#include "stdafx.h"
#include <iostream>

using namespace std;

class person
{
public:
	person(){}
	person(int nID, char *szName) : nID(nID), szName(szName){}
	int getID()
	{
		return this->nID;
	}
	char* getName()
	{
		return this->szName;
	}
	void setID(int nID)
	{
		this->nID = nID;
	}
	void setName(char *szName)
	{
		this->szName = szName;
	}
protected:
private:
	int nID;
	char *szName;
};

class student : public person
{
public:
	student(){}
	int getClassID()
	{
		return this->nClassID;
	}
	int getGrade()
	{
		return this->grade;
	}
	void setClassID(int nClassID)
	{
		this->nClassID = nClassID;
	}
	void setGrade(int grade)
	{
		this->grade = grade;
	}

protected:
private:
	int nClassID;
	int grade;
};

class teacher : public person
{
public:
	teacher(){}
	char *getPosition()
	{
		return this->position;
	}
	char *getDepart()
	{
		return this->depart;
	}
	void setPosition(char *position)
	{
		this->position = position;
	}
	void setDepart(char *depart)
	{
		this->depart = depart;
	}
protected:
private:
	char *position;
	char *depart;
};
int _tmain(int argc, _TCHAR* argv[])
{
	student stu;
	teacher tea;

	//stu
	cout << "请输入学生编号:";
	int nID = 0;
	cin >> nID;
	stu.setID(nID);

	cout << "请输入学生姓名:";
	char szName[100] = {'\0'};
	cin >> szName;
	stu.setName(szName);

	cout << "请输入学生班号:";
	int nClassID = 0;
	cin >> nClassID;
	stu.setClassID(nClassID);

	cout << "请输入学生成绩:";
	int grade = 0;
	cin >> grade;
	stu.setGrade(grade);

	cout << "*******************" << endl;
	cout << "学生编号为:" << stu.getID() << endl;
	cout << "学生姓名为:" << stu.getName()  << endl;
	cout << "学生班号为:" << stu.getClassID() << endl;
	cout << "学生成绩为:" << stu.getGrade() << endl;
	cout << "*******************" << endl;

	//tea
	cout << "请输入教师编号:";
	cin >> nID;
	tea.setID(nID);

	cout << "请输入教师姓名:";
	cin >> szName;
	tea.setName(szName);

	cout << "请输入教师职称:";
	char position[100] = {'\0'};
	cin >> position;
	tea.setPosition(position);

	cout << "请输入教师部门:";
	char depart[100] = {'\0'};
	cin >> depart;
	tea.setDepart(depart);

	cout << "*******************" << endl;
	cout << "教师编号为:" << tea.getID() << endl;
	cout << "教师姓名为:" << tea.getName() << endl;
	cout << "教师职称为:" << tea.getPosition() << endl;
	cout << "教师部门为:" << tea.getDepart() << endl;
	cout << "*******************" << endl;

	return 0;
}

ex7.

/************************************************************************/
/*7提高.编写一个栈的类模板,实现栈的push,和pop操作,提供对任何数据类型的插入
       和删除。(先进后出)
*/
/************************************************************************/
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class T>
class Stack
{
public:
	Stack()
	{
		StackBase = new T[10];
		StackPoint = StackBase;
	}
	~Stack(){}
	void push(T data)
	{
		if (this->StackPoint == this->StackBase + 10)
		{
			cout << "栈满!" << endl;
		}
		*this->StackPoint = data;
		this->StackPoint++;
	}
	T pop()
	{
		if (this->StackBase == this->StackPoint)
		{
			cout << "栈空!" << endl;
		}
		this->StackPoint--;
		T data = *this->StackPoint;
		return data;
	}

	T *StackPoint;
	T *StackBase;
protected:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
	Stack<int> st;
	st.push(5);
	st.push(6);
	cout << *st.StackBase << *st.StackBase + 1 << endl;//可以使用循环遍历输出
	st.pop();
	cout << *st.StackPoint << endl;//可以使用循环遍历输出
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 前言 第1章 对象的演化 1 1.1 基本概念 1 1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 1.2.2 采用渐进的学习方式 4 1.2.3 运行效率 4 1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺什么 10 1.3.6 方法应当提供什么 10 1.4 起草:最小的方法 12 1.4.1 前提 13 1.4.2 高概念 14 1.4.3 论述(treatment) 14 1.4.4 结构化 14 1.4.5 开发 16 1.4.6 重写 17 1.4.7 逻辑 17 1.5 其他方法 17 1.5.1 Booch 18 1.5.2 责任驱动的设计(RDD) 19 1.5.3 对象建模技术(OMT) 19 1.6 为向OOP转变而采取的策略 19 1.6.1 逐步进入OOP 19 1.6.2 管理障碍 20 1.7 小结 21 第2章 数据抽象 22 2.1 声明与定义 22 2.2 一个袖珍C库 23 2.3 放在一起:项目创建工具 29 2.4 什么是非正常 29 2.5 基本对象 30 2.6 什么是对象 34 2.7 抽象数据类型 35 2.8 对象细节 35 2.9 头文件形式 36 2.10 嵌套结构 37 2.11 小结 41 2.12 练习 41 第3章 隐藏实现 42 3.1 设置限制 42 3.2 C++的存取控制 42 3.3 友元 44 3.3.1 嵌套友元 45 3.3.2 它是纯的吗 48 3.4 对象布局 48 3.5 类 48 3.5.1 用存取控制来修改stash 50 3.5.2 用存取控制来修改stack 51 3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用构造函数确保初始化 55 4.2 用析构函数确保清除 56 4.3 清除定义块 58 4.3.1 for循环 59 4.3.2 空间分配 60 4.4 含有构造函数和析构函数的stash 61 4.5 含有构造函数和析构函数的stack 63 4.6 集合初始化 65 4.7 缺省构造函数 67 4.8 小结 68 4.9 练习 68 第5章 函数重载与缺省参数 69 5.1 范围分解 69 5.1.1 用返回值重载 70 5.1.2 安全类型连接 70 5.2 重载的例子 71 5.3 缺省参数 74 5.4 小结 81 5.5 练习 82 第6章 输入输出流介绍 83 6.1 为什么要用输入输出流 83 6.2 解决输入输出流问题 86 6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 6.9 建立操纵算子 108 6.10 输入输出流实例 111 6.10.1 代码生成 111 6.10.2 一个简单的数据记录 117 6.11 小结 123 6.12 练习 123 第7章 常量 124 7.1 值替代 124 7.1.1 头文件里的const 124 7.1.2 const的安全性 125 7.1.3 集合 126 7.1.4 与C语言的区别 126 7.2 指针 127 7.2.1 指向const的指针 127 7.2.2 const指针 127 7.2.3 赋值和类型检查 128 7.3 函数参数和返回值 128 7.3.1 传递const值 128 7.3.2 返回const值 129 7.3.3 传递和返回地址 131 7.4 类 133 7.4.1 类里的const和enum 133 7.4.2 编译期间类里的常量 134 7.4.3 const对象和成员函数 136 7.4.4 只读存储能力 139 7.5 可变的(volatile) 140 7.6 小结 141 7.7 练习 141 第8章 内联函数 142 8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱 152 8.5 预处理器的特点 153 8.6 改进的错误检查 154 8.7 小结 155 8.8 练习 155 第9章 命名控制 157 9.1 来自C语言中的静态成员 157 9.1.1 函数内部的静态变量 157 9.1.2 控制连接 160 9.1.3 其他的存储类型指定符 161 9.2 名字空间 161 9.2.1 产生一个名字空间 162 9.2.2 使用名字空间 163 9.3 C++中的静态成员 166 9.3.1 定义静态数据成员的存储 166 9.3.2 嵌套类和局部类 168 9.3.3 静态成员函数 169 9.4 静态初始化的依赖因素 171 9.5 转换连接指定 174 9.6 小结 174 9.7 练习 174 第10章 引用和拷贝构造函数 176 10.1 C++中的指针 176 10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的选择 188 10.4 指向成员的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值