C++基础知识第四天

cpp软件架构狮 2018-07-19 05:49:01

1.explicit:修饰构造函数; 禁止编译器隐式转换

1)针对单参数的构造函数 2)或者除第一个参数外其他参数都有默认值的多参构造函数。

2. C++ 中动态分配内存:

new :在堆上分配内存。分配对象的堆内存时会调用构造函数

申请string类型的空间只能string类型数据,可改为string *ps = new string(“10”);

delete:释放堆内存,在释放堆内存前会调用析构函数。

delete void*指针,不会调用析构函数。

3.创建动态数组:

int * arr = new int[10]; 创建一个 int 类型数组,元素10个。

delete [] arr; 释放内存。

4.创建自定义对象数组,必须提供无参构造函数。

同时数组有几个元素就调用几次"无参构造函数和析构函数"。

delete void* 指针可能会出错。没有调用析构函数

class print
{
	private:
	static int a; //在类中声明静态变量
	public:
};

int print::a = 0; //在类外初始化静态变量

5.静态成员变量:

1)在编译阶段就分配空间。对象还没有创建;

2)必须在类中声明,在类外初始化(或定义)。

3)归同一个类的所有对象所有,共享同一个静态变量。在为对象分配的空间中不包含静态成员所占空间

4)有权限限制:private静态变量和 public静态变量。

private静态变量;在类外不能访问和操作。 类外访问:print::a;"erro"; 类外操作:print::a = 6;"erro"

public静态变量;在类外可以访问和操作。 类外访问:print::a;"yes"; 类外操作:print::a = 6;"yes"

5)const 静态成员变量(const static int a = 8);

定义静态变量 const 静态成员变量时,最好在类的内部初始化。

"静态变量的调用:"

用类名加域作用符: print::a;

用对象名加取址符: class p1; p1.a;

6.静态成员函数:(主要是为了访问静态变量)

与静态变量一样,在没有创建对象前即可通过类名调用。

1).静态成员函数只能访问 "静态成员变量",不能访问普通成员变量。

2).静态成员函数的使用规则和静态成员变量一样

3)静态成员函数也有使用权限。类外无法访问私有静态函数。

4)普通成员函数可访问"静态成员变量",也可访问"非静态成员变量"

7.单例模式:一个类只存在一个对象。

条件:1)构造函数、拷贝函数、析构函数私有化。

2)提供私有化静态成员变量指向一个对象

3)提供外部获得对象的静态成员函数。

class person
{
	public:
	void print_func(string content)
	{
		cout << "打印内容" << content << endl;
		mcount++;
		cout << "打印次数" << mcount << endl;
	}
	static person *getInstance(){ //静态成员函数 “在公共区域”,提供接口
		return p1;
	}
	private:
	person(){ //私有化构造函数
		mcount = 0;
	}
	person(const person &){} //私有化拷贝函数
	~person(){} //私有化析构函数
	private:
	static person * p1; //私有化静态成员变量
	int mcount;
};
person *person::p = new person; (类外初始化静态变量)//私有化的静态成员变量指向一个对象
int main(void)
{
	person *p1 = person::getInstance(); p1和p2的地址一样。
	person *p2 = person::getInstance(); 因为他们为指向同一个对象。
	p1->print_func("晚上好!!!");
	p2->print_func("加油,胜利就在眼前!!!");
	return 0;
}

8.C++ 成员变量和函数的存储:(成员变量和函数分开存储)

1)静态变量不在类对象中存储

2)函数不在类对象中存储(静态函数与非静态函数都是)

3)类对象中只存储普通成员变量。

9.this 指针:(因为C++成员的存储特点。)

1)this指针永远指向当前对象。

2)"静态成员函数" 内部没有 this 指针,所以静态成员函数不能操作非静态成员变量。

"this 指针的使用:"

1)当形参与成员变量同名时,可以通过this指针区分。

2)在类的非静态成员函数中返回对象本身。可以使用:return *this;

class person
{
public:
	person( int a, string name )
	{
		this->a		= a;
		this->name	= name;
	}
	person func()
	{
		return(*this);
	}
public:
	int	a;
	string	name;
};

10.空对象指针访问成员的不同情况:由于( this 指针的存在)

1)当不访问成员变量的时候是允许的。

2)当访问成员变量时,函数通过this指针寻找成员变量,此时就会报错。

class ARE
{
public:
	void print()
	{
		cout << "hello world !!1" << endl;
	}


	void get_func()
	{
		cout << ma << endl;
	}


public:
	int ma;
};
int main( void )
{
	ARE *a1 = NULL;
	a1->print(); "可以访问,因为此时不访问成员变量"
	a1->get_func(); "不可以访问,它队成员变量进行了访问"
	return 0 ;
}

10.const 对成员函数的修饰。

(int func() const {});注意:const 要写在小括号后面,大括号前面。(===》int func(const ARE * const this ))

1)const 修饰 this 指针指向的内存区域。成员函数体内不可改变类中任何变量,除非变量前面用 mutable 进行修饰。

mutable 对成员变量的修饰

1)用它修饰后,任何情况下都可以对变量进行修改。

11.const 修饰对象(常对象)。(不允许修改对象的属性)

1)常对象可访问 const 或非 const 变量,不能修改变量。除非变量前用 mutable 修饰。

2)常对象只能调用 const 修饰的常函数。

12.友元函数。(全局函数和成员函数两种)

1).friend 关键字只出现在声明处。

2).其他类、类成员函数、全局函数都可声明为友元。

3)友元函数不是类的成员,不带this指针。

4)友元函数可访问对象的任意成员属性,包括私有属性。

注意:注意:

1)友元关系不能被继承

2)友元关系是单向的,类A是类B的友元,但类B不一定是类A的友元。

3)友元关系不具有传递性。类B是类A的友元,类C是类B的友元,但类C不一定是类A的友元。

12.操作符重载:

1)本质:"函数的调用"。

函数的参数取决于两个因素:

1)运算符是一元还是二元。

2)运算符被定义为全局函数还是成员函数。

2)运算符重载的限制:

1)使用运算符重载不能改变预算符的优先级,不能改变运算符的参数个数。

1)不能重载的运算符:"."; "::"; ".*"; "? :"; "sizeof".

2)除"="号外,基类中重载的运算符都将被派生类继承。

3)特殊运算符:

1)“=”; “[]”; “()”; “->”;操作符只能通过成员函数重载

2)“<<”; “>>”; 只能进行友元函数重载

3)不要重载 “&&”; “||” ; 操作符,因为无法实现短路原则。

13.运算符重载建议:

1)所有的一元运算符, 建议使用:成员函数

2)“=”;“[]”;“”;“->”; 必须使用成员函数

3)+=,-=,*=,&=,!=,%=,^=, 建议使用:成员函数

4)其他二元运算符 建议使用:非成员函数

5.重载"="号操作符的步骤

1)先释放旧内存

2)返回一个引用,实现链式编程。

本页共139段,3063个字符,6116 Byte(字节)