c++基础知识杂记(Day6类和动态内存分配)

1.strlen

strlen()返回字符串的长度,但不包括末尾的空字符,因此构造函数要将len+1;
例:int len = strlen("abc"); //计算得出len值为3

2.自动存储对象

自动存储对象的顺序与创建顺序相反,如果创建顺序为ABC,则删除顺序为CBA。

3.拷贝构造函数

何时调用:新建一个对象并将其初始化为同类现有对象时,拷贝构造函数都将被调用。
下面4种声明都调用构造函数:
1.StringBad ditto(motto);//调用 StringBad(cosnt StringBad &);
2.StringBad metoo = motto;//调用 StringBad(cosnt StringBad &);
3.StringBad also = StringBad(motto);//调用 StringBad(cosnt StringBad &);
4.StringBad *pStringBad = new StringBad(motto);//调用 StringBad(cosnt StringBad &);
由于按值传递对象将调用拷贝构造函数,因此应该按引用传递对象。按值传递是先创建一个副本对象,再赋值,而按引用传递是直接得到那个值。可以节省调用构造函数的时间以及存储新对象的空间。

有何功能:默认的拷贝构造函数逐个复制非静态成员(成员复制也成为浅复制),复制的是成员的值。
必须定义拷贝构造函数的原因在于,一些类成员是使用new初始化的、指向数据的指针,而不是数据本身。

4.静态类成员函数和静态类成员变量

1.静态类成员函数: 不能通过对象调用静态成员函数,静态成员函数也不能使用this指针。如果静态成员函数是在公有部分声明的,则可以使用类名和作用域解析运算来调用它。
 例: 
 class String
  { 
  public:  
  	static int HowMany()  
  	{
  		return num_strings; 
  	}
  };
  调用:
  int count = String::HowMany();
  由于静态成员函数不与特点的对象相关联,因此只能使用静态数据成员。所以静态方法只能访问静态成员。
2.静态成员变量:
  class String
  { 
   public:
   	static int num_strings;  
  };
  
调用:int String::num_strings = 0;
注意:静态成员变量类内声明,类外初始化。

5.有关返回对象的说明

1.返回指向const对象的引用
使用const引用旨在提高效率。
①返回对象将调用拷贝构造函数,而返回引用不会。因此,返回引用的效率高。
②引用指向的对象应该在调用函数执行时存在。

2.返回指向非const对象的引用
重载复制运算符以及重载与cout一起使用的<<运算符。
前者是为了提高效率,而后者必须这样做。

3.返回对象
如果返回的对象是被调用函数中的局部变量,则不应该按引用的方式返回它,因为在被调用函数执行完毕时,局部对象将调用析构函数。因此,当控制权回到调用函数时,引用指向的对象将不再存在。在这种情况下,应反回对象而不是引用。

4.返回const对象
注意:如果方法或函数要返回局部对象,则应返回对象,而不是指向对象的引用。在这种情况下,将使用复制构造函数来生成返回的对象。

6.总结及注意

注意:在拷贝构造中,程序员自己定义的拷贝构造函数一定要是深拷贝。不要是浅拷贝。
浅拷贝:是指原始对象的成员指向一个数据块,副本成员也将指向这个数据块。在调用析构函数的时候,该数据块被释放了两次。
解决办法:定义一个特殊的拷贝构造函数来重新定义初始化,并重载复制运算符。在上述任何一种情况下,新的定义豆浆指向数据的副本,并使新对象指向这些副本。这样,旧对象和新对象都将引用独立的,相同的数据而不会重叠。实际上,我们拷贝的是实际的数据,而不是拷贝指向数据的指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值