lyk's Blog

lyk的个人博客

C++友元

友元 只有本类中的成员函数可以访问本类的私有成员,阻止其他访问,但在某些情况下。我们要访类的私有成员,如果把私有成员定义为共有的话,就破坏了类的隐藏性,这是我们就用到了友元。 友元(friend)机制可以允许类外的函数和其他类访问本类的私有成员。 友元在类中声明,以关键字firend开始,可以在类中任意位置声明。友元函数虽然定义在类内,但其并不是类成员,所以其不受public,protected,private的影响. 友元函数 将非成员函数声明为友元函数 友元函数是不在类中的函数,但是可以访问类内的所有成员的函数。 #include <bits/stdc++.h> using namespace std; class A { private : int x; friend void query_pri(A a); //在private里定义的友元函数 ...

this指针

什么是this this是一个const指针,存的是当前对象的地址,指向当前对象,通过this指针可以访问类中的所有成员。 当前对象是指正在使用的对象,比如a.print(),a就是当前对象。 关于this 每个对象都有this指针,通过this来访问自己的地址。 每个成员函数都有一个指针形参(构造函数没有这个形参),名字固定,称为this指针,this是隐式的。 编译器在编译时会自动对成员函数进行处理,将对象地址作实参传递给成员函数的第一个形参this指针。 this指针是编译器自己处理的形参,不能在成员函数的形参中添加this指针的参数定义。 this只能在成员函数中使用,全局函数,静态函数不能使用this。因为静态函数没有固定对象。 this的使用 #include <bits/stdc++.h> using names...

C++静态成员

静态成员变量 不同的对象占用不同的内存,这就使不同对象的成员变量相互独立,互不影响。给定两个对象a和b,假设我们修改了a.a,b.a并不会受到影响。 如果我们想要在多个对象之间共享一个数据,这就用到了静态成员变量。 静态成员变量是一种特殊的成员变量,被static修饰。 只能被定义一次,储在全局常量区,不占用对象的储存空间这就意味静态成员不随对象的创建而分配内存,也不随对象的销毁而释放内存。 被同类的全体成员共享,单静态成员变量只有一个实例存在,与类定义了多少对象无关, 也就是说静态成员是与该类相关的,而不是与类的实例对象相关 静态成员变量不能在类中初始化,因为静态成员变量是被所有的对象所共享,若在类中初始化的话每次创建一个新的对象它的值都要被修改。 静态成员变量不能用初始化列表进行初始化,静态成员变量只能在类外进行初始化,一般缺省值为0。 type cla...

继承(一) 三种继承方式

继承定义 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。 继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展。原来的类称为基类,继承的类称为派生类,他们的关系就像父子一样,所以又叫父类和子类。 一般格式如下: class 派生类名 : 继承类型 基类名 派生类成员可以访问基类的public成员和protected成员。 三种继承方式 继承类型有三种,共有继承(public),私有继承(private)和保护继承(protected)。 共有继承: 共有继承的特点是基类成员在派生类中都保持原来的状态 基类中的public仍为public, 基类中的protected仍为protected, 基类中的private仍为private; 私有继承: 私有继承的特点是基类中所有成员在派生类中都变为私有成员 基类中的publ...

析构函数

什么是析构函数 创建对对象时,系统会自动调用构造函数为我们进行初始化,同样,在销毁对象时也会自动调用一个函数为我们收尾,如释放内存等,这个函数是析构函数。 析构函数也是一种特殊的成员函数。 特点 析构函数的名称和类的名称相同,在前面加~ 析构函数没有返回值,无参数 析构函数只能在类中使用,且只有一个参数 不能继承和重载析构函数 析构函数不能显性调用 什么时候调用析构函数 1.生命周期结束被销毁时 #include <bits/stdc++.h> using namespace std; class A { public : A(){ printf("A()\n"); } ~A() { printf("~A()\n"); } }; int main() { A a; printf("do sth\n"); ret...

构造函数(三) 拷贝构造函数

什么是拷贝构造函数 拷贝听起来真高级 拷贝构造函数形如 class_name(const class_name &object_name) 拷贝构造函数是一种特殊的构造函数,只有一个参数,这个参数是本类中的一个对象,以引用的形式传参,一般用const修饰,使参数值不变。 如果没有定义拷贝构造函数,编译器会自动隐式生成一个拷贝构造函数,用来简单的复制类中每个成员变量。 一个简单的类对象拷贝 #include <bits/stdc++.h> using namespace std; class A { private : int a, b; public : A(int x, int y) : a(x), b(y) {} void print() { printf("%d %d\n", a, b); } }; int main(...

构造函数(二) 初始化列表

初始化列表 为了给类成员变量赋值,可以再构造函数的函数体内对成员变量赋值,也可以采用初始化列表。 如: #include <bits/stdc++.h> using namespace std; class A { private : int a, b; public : A(int x, int y) : a(x), b(y) {} /* 相当于 A(int x, int y) { a = x, b = y; } */ void print() { printf("%d %d\n", a, b); } }; int main() { A tmp(10, 20); tmp.print(); A *p = new A(30, 40); p->print(); return 0; } 输出 10 2...

构造函数(一) 构造函数及重载

什么是构造函数 构造函数是初始化类对象的类成员函数。在c++中,当对象被创建时,自动调用构造函数,构造函数是该类的一个特殊成员的函数 构造函数和一般的成员函数有什么不同 构造函数的名称和类的名称完全相同 构造函数没有返回类型(包括void) 创建对象的时候自动调用构造函数 如果我们不写构造函数,编译器会自动创建一个没有参数的构造函数,函数主体内什么也没有(默认构造函数) 函数体中不能有return语句 构造函数 默认构造函数 A类中编译器自动生成的构造函数如下 A(){} 没有参数的构造函数,不论是编译器自动生成的还是自己写的,都称为默认构造函数。 如果写了构造函数,编译器就不会自动生成默认构造函数。 #include <bits/stdc++.h> using namespace std; class A { public :...