学习笔记

1。

1、  用在类中的析构函数之前,表示该函数是析构函数。如类A的析构函数

  class A

  {

    //...  ~A(){}//析构函数

   };

2、  用于数字或者整形变量之前,表示对该数取反操作,其规则是~0=1, ~1=0, 如二进制0101 0101取反后就是1010 1010

C++之类的析构函数

简单说说类的析构函数,它是类的一个成员函数,名字由波浪号加类名构成。看它的名字我们大概就能联想到他功能,是执行与构造函数相反的操作:释放对象使用的资源,并销毁非static成员。

同样的,我们来看看析构函数的几个特点:  

 

1.函数名是在类名前加上~,无参数且无返回值。

2.一个类只能有且有一个析构函数,如果没有显式的定义,系统会生成一个缺省的析构函数(合成析构函数)。

3.析构函数不能重载。每有一次构造函数的调用就会有一次析构函数的调用。

 

2。

template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。

声明类模板要增加一行:
    template<class 类型参数名>
如template<class dataType>其中的类型参数名为虚拟的类型参数名,以后会被实际的类型名替代。如例子中的

dataType将会被int,float,char等替代。

如果说类是对象的抽象,对象是类的实例。那么类模板是类的抽象,类是类模板的实例。

实例化时必须用实际的类型名去替代虚拟的类型,如Compare<int> cmp1(3,7);

3。

表示作用域,和所属关系

::是运算符中等级最高的,它分为三种:1)global scope(全局作用域符),用法(::name)2)class scope(类作用域符),用法(class::name)

1

2

3

4

5

6

7

8

9

class A

{

  public:

    int test();

}

int A::test()//表示test是属于A的

{

 return 0;

}

3)namespace scope(命名空间作用域符),用法(namespace::name)他们都是左关联(left-associativity)他们的作用都是为了更明确的调用你想要的变量,如在程序中的某一处你想调用全局变量a,那么就写成::a,如果想调用class A中的成员变量a,那么就写成A::a,另外一个如果想调用namespace std中的cout成员,你就写成std::cout(相当于using namespacestd;cout)意思是在这里我想用cout对象是命名空间std中的cout(即就是标准库里边的cout)

4。

最后结论是delete以后内存释放了,指向的地址也变了,不能再对原来的变量赋值。

还有delete和new搭配着用最好,new[]搭配delete[],new搭配delete。(类对象数组一定要用delete[],基本数据类型两者均可,但最好搭配使用)

5.

利用friend友元函数对操作符<<进行重载,重载代码如下:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Date
  5. {
  6. friend ostream& operator<<(ostream&,const Date&);
  7.   
  8.     int year;
  9.     int month;
  10.     int day;
  11. public:    
  12.     Date() {year=2013; month=9; day=30;}
  13. };
  14.  
  15. ostream& operator<<(ostream& out,const Date& date)
  16. {
  17.     out<<date.year<<'-'<<date.month<<'-'<<date.day;
  18.     return out;
  19. }
  20.  
  21. int main()
  22. {
  23.     Date date;
  24.     cout<<date<<endl;
  25.     system("pause"); 
  26. }

注意上面的ostream& operator<<(ostream& out,const Date& date)的3个引用&,

1. 第一个ostream&,返回的是ostream类对象的引用,为了进行连续的运算,如cout<<a<<b;

先进行cout<<a,运算玩了,返回cout的引用,就是返回了cout本身,原来的式子变为cout<<b;

这样就能连续写了,cout<<a<<b<<c<<........

2. 第二个ostream& out, out是随便取的名字,就是ostream类的对象,与cout用法一样,通过<<将数据传到out里,所以输出时用cout<<a,这时就调用 operator<<(cout,a), 把cout作为参数传入。对于上述例子cout<<date<<endl;,就是执行了cout<<date.year<<'-'<<date.month<<'-'<<date.day; return cout;(注意,这里就是cout,其中year等是基本类型,c++已经写好了)

再次说明cout并不特殊,就是预先定义好了的ostream类的对象。

3. 第三个const Date&,主要为了快速出入参数,如果不用&,将会复制一个参数,而不是将原来的对象直接传入,就会调用拷贝构造函数(如果没写的话编译器自动提供),浪费时间,有时还会产生错误,比如数据成员里有指针时,编译器提供的拷贝构造函数将会自动复制 一个指针,与原来的指针指向同一个地址,这样改变一个另一个也会改变,这是我们不想要的,我们需要拷贝时指针指向不同的地址,两个对象互不干扰,只是指针所指变量的值相等就行,这就需要自己写 拷贝构造函数,自己new等。 所以一般用&,加const防止意外修改。 --------------------- 本文来自 小伟锅 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u011028345/article/details/76445970?utm_source=copy

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值