cpp软件架构狮 2018-07-19 05:49:01
1)针对单参数的构造函数 2)或者除第一个参数外其他参数都有默认值的多参构造函数。
new :在堆上分配内存。分配对象的堆内存时会调用构造函数
申请string类型的空间只能string类型数据,可改为string *ps = new string(“10”);
delete:释放堆内存,在释放堆内存前会调用析构函数。
delete void*指针,不会调用析构函数。
int * arr = new int[10]; 创建一个 int 类型数组,元素10个。
delete [] arr; 释放内存。
同时数组有几个元素就调用几次"无参构造函数和析构函数"。
delete void* 指针可能会出错。没有调用析构函数
class print { private: static int a; //在类中声明静态变量 public: };
int print::a = 0; //在类外初始化静态变量
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;
与静态变量一样,在没有创建对象前即可通过类名调用。
1).静态成员函数只能访问 "静态成员变量",不能访问普通成员变量。
2).静态成员函数的使用规则和静态成员变量一样
3)静态成员函数也有使用权限。类外无法访问私有静态函数。
4)普通成员函数可访问"静态成员变量",也可访问"非静态成员变量"
条件: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; }
1)静态变量不在类对象中存储
2)函数不在类对象中存储(静态函数与非静态函数都是)
3)类对象中只存储普通成员变量。
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; };
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 ; }
1)const 修饰 this 指针指向的内存区域。成员函数体内不可改变类中任何变量,除非变量前面用 mutable 进行修饰。
mutable 对成员变量的修饰
1)用它修饰后,任何情况下都可以对变量进行修改。
1)常对象可访问 const 或非 const 变量,不能修改变量。除非变量前用 mutable 修饰。
2)常对象只能调用 const 修饰的常函数。
1).friend 关键字只出现在声明处。
2).其他类、类成员函数、全局函数都可声明为友元。
3)友元函数不是类的成员,不带this指针。
4)友元函数可访问对象的任意成员属性,包括私有属性。
注意:注意:
1)友元关系不能被继承
2)友元关系是单向的,类A是类B的友元,但类B不一定是类A的友元。
3)友元关系不具有传递性。类B是类A的友元,类C是类B的友元,但类C不一定是类A的友元。
1)本质:"函数的调用"。
函数的参数取决于两个因素:
1)运算符是一元还是二元。
2)运算符被定义为全局函数还是成员函数。
2)运算符重载的限制:
1)使用运算符重载不能改变预算符的优先级,不能改变运算符的参数个数。
1)不能重载的运算符:"."; "::"; ".*"; "? :"; "sizeof".
2)除"="号外,基类中重载的运算符都将被派生类继承。
3)特殊运算符:
1)“=”; “[]”; “()”; “->”;操作符只能通过成员函数重载
2)“<<”; “>>”; 只能进行友元函数重载
3)不要重载 “&&”; “||” ; 操作符,因为无法实现短路原则。
1)所有的一元运算符, 建议使用:成员函数
2)“=”;“[]”;“”;“->”; 必须使用成员函数
3)+=,-=,*=,&=,!=,%=,^=, 建议使用:成员函数
4)其他二元运算符 建议使用:非成员函数
5.重载"="号操作符的步骤
1)先释放旧内存
2)返回一个引用,实现链式编程。
本页共139段,3063个字符,6116 Byte(字节)