C++学习部分总结以及遇到的的一些问题
一、命名空间、无名空间的使用
命名空间:在全局范围之内取一块区域并命一个名称
无名空间:没有名字的命名空间
使用实例:
#include<iostream>
#include<cstdio>
using namespace std;
int a = 1;
namespace space1
{
int a = 2;
namespace space2
{
void founction1() {
printf("space2\n");
}
}
namespace
{
void founction2() {
printf("无名空间1\n");
}
}
}
namespace
{
int a = 3;
void founction1() {
printf("无名空间2\n");
}
}
using namespace space1;
int main()
{
cout<< "a=" << a <<endl;
cout << "a=" << ::a << endl;
return 0;
}
学习遇到的问题:命名空间无名空间可嵌套使用,在嵌套使用时,如以上代码,在全局定义一个变量a并初始化为1,在命名空间space1中定义一个变量a初始化为2,在main()函数若想使用全局的a则需要使用域作用符号(此时将全局看作一个未命名空间),那么在为命名空间2中的a该如何去使用?
二、动态内存
动态内存:程序在运行时才分配的空间,称之为动态内存。
new:用于开辟堆区空间,相当于是C里的malloc
delete:用于释放堆区空间,相当于是C里的free
new/delete的使用:
对于变量:
数据类型 * 标识符名称 = new 数据类型 [数组大小];
可初始化:数据类型 * 标识符名称 = new 数据类型 (初始值);
delete 标识符名称;
对于数组:
数据类型 * 标识符名称 = new 数据类型 ;
可初始化:数据类型 * 标识符名称 = new 数据类型 (初始值){元素值};
delete [] 标识符名称;
new/delete与malloc/free的对比:
malloc/free | new/delete |
---|---|
malloc/free是函数 | new/delete是一个操作符 |
malloc/free开辟堆区空间的时候不能进行初始化的工作 | new/delete开辟空间的时候能进行初始化工作 |
malloc/free开辟堆区空间的时候需要手动的去计算空间的大小 | new/delete开辟空间的时候自动计算空间的大小 |
malloc/free开辟堆区空间的时候需要强制类型转换 | ew/delete开辟空间的时候不需要强制类型转换 |
malloc/free仅仅只是做了开辟堆区空间的工作 | new/delete开辟空间的时候,还可以完成变量的初始化 |
类和对象
类的成员访问修饰符
作用:为了保护类的成员
三种修饰符:public(公共)、protected(受保护)、private(私有)
访问修饰符的作用范围:
(1)public(公共)
用户把变量或者是函数放置在类的public下,那么这些变量和函数就具有公共的属性
在public下的成员对于整个类、对于类体外、对于友元函数、对于派生类(子类)都是可见的
(2)private(私有)
用户把变量或者是函数放置在类的private下,那么这些变量和函数就具有私有属性
在private下的成员对于整个类、对于友元函数是可见的
在private下的成员对于类的外部、对于派生类(子类)是不可见的
(3)protected(受保护)
用户把变量或者是函数放置在类的protected下,那么这些变量和函数就具有保护属性
在protected下的成员对于整个类、对于友元函数、对于派生类(子类)是可见的
在protected下的成员对于类的外部是不可见的
(4)未写修饰符
如果在类里面没有写任何的类的成员访问修饰符,那么该类下的成员都是归于private属性下(一般将成员变量放置到private属性下)
拷贝构造函数
拷贝构造函数的格式:
类名(const 类名 & obj)
{
//拷贝构造函数代码块
}
例如:
People(const People & obj)
{
//代码块
}
(1)浅拷贝
相当于是把一个对象里的成员变量和它的值拷贝了一份儿给另外一个对象。
如果类里面有指针对象并且在堆区开辟了空间,而且在析构函数里对指针对象进行了释放,这时候如果使用浅拷贝,造成堆区空间重复释放,而引起程序崩溃
(2)深拷贝
相当于是把一个对象里的成员变量拷贝了一份儿,但是变量的地址又重新开辟了一个空间,解决的问题就是堆区重复释放造成程序崩溃的问题
注:
如果类里面没有指针对象在堆区开辟空间,那么浅拷贝和深拷贝的作用是一致的
this指针
静态成员函数中没有this指针&友元函数中没有this指针
静态成员/静态成员函数
静态成员函数里没有this指针
静态成员函数不能访问类的非静态成员
类的非静态成员函数可以访问类的静态成员
继承与多态
继承的权限
父类权限 | 子类继承方式 | 继承后权限 |
---|---|---|
public | public | public |
public | protect | protect |
public | private | private |
protect | public | protect |
protect | protect | protect |
protect | private | private |
private | public | 未继承到private |
private | protect | 未继承到private |
private | private | 未继承到private |
多态
构成多态性:
(1)两个类具有继承关系
(2)子类中必须重写父类的方法(子类方法中的内容与父类中的方法可以不一样)
(3)父类中的方法必须是虚函数
多态性的调用时机
当父类的指针或者是引用指向子类时
注:
具有继承关系的两个类,是支持父类和子类相关联(父类的指针或者是引用指向子类)
静态绑定
函数的定义和调用在编译阶段就确定了,称之为静态绑定,在C里的函数就是如此,在C++里函数的重载也是如此
在类中:
静态绑定的时候是根据类的指针对象或者是引用的类型来确定函数的调用,而不是通过类的指针或者是引用指向的对象的类型来确定
动态绑定
函数的定义和调用在运行阶段才确定,称之为动态绑定
抽象类
抽象类只是给子类提供一个基类
抽象类不能实例化为对象
抽象类里只是描述了一些行为,但没有具体实现行为(纯虚函数),需要在子类中去重新实现抽象类的行为