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 |
|
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友元函数对操作符<<进行重载,重载代码如下:
- #include <iostream>
- using namespace std;
- class Date
- {
- friend ostream& operator<<(ostream&,const Date&);
- int year;
- int month;
- int day;
- public:
- Date() {year=2013; month=9; day=30;}
- };
- ostream& operator<<(ostream& out,const Date& date)
- {
- out<<date.year<<'-'<<date.month<<'-'<<date.day;
- return out;
- }
- int main()
- {
- Date date;
- cout<<date<<endl;
- system("pause");
- }
注意上面的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