三 名字空间作用域 namespace
C 语言的作用域
1局部作用域
2全局作用域
C++
1局部作用域
2全局作用域
3类作用域
Namespace 解决全局作用域名字的冲突
Namespae MyName std
{
int gdata = 10 ;
Int sum (int a,int b)
{
Return a+d;
}
}
Using MyNmae :: gdata ;//using 声明 一次只能带一个gdata出来
Using namespace MyName ;//using 指示符
Int main()
{
Int a= gdata;
}
面试问题
Int * p =new int [3];
Int *p=new int [3]();
底下那个表达式可以初始化
C++的类和对象
面向对象语言有什么四大特征?
抽象 封装 继承 多态
面向对象语言有什么三大特征?
封装 继承 多态
累的创建和表的创建
1 先问题的场景都有哪些实体
2 找实体的属性了;
3 找实体之间的关系
数据库表
一对一
一对多
多对多
类之间的关系
类的访问限定符:public private protect
概念:
1创建累的目的,是用来抽象实体的类型,从实体的属性和行为两方面,得到的成员变量的和成员方法,因为类是的实体类型的抽象,所以不占内存空间;
2用struct和 class都可以定义类,不同的是,在没有限定符的情况子下,class定义的类默认都是private 访问限定,struct都是public访问限定
3 分析类类型字节大小时候,和struct结构体的字节大小计算方式一样,都存在字节对齐问题,唯一不同,c语言中空struct大小为0, 而C++的空class,大小为1;
4. 类成员方法的定义,可以在类外 也可以在类内;
5. 6.查看类对象内存布局,打开vs的命令提示符工具
E:\code\20180413\20180413>cl 20180413.cpp /d1reportSingleClassLayoutCGoodsInfo
6 成员方法在类内实现的话,自动处理成内连inline函数
7普通成员变量和成员方法一定要依赖对象才能调用;
8.一个类产生多个对象,每个对象都有自己的一份成员变量,它们共享这个类的成员方法
问题:共享方法,他是怎么知道要操作那个对象呢?
结论一:累的成员方法一经过编译,形参都会加上一个当前类类型的this 指针变量
结论二:对象调用成员方法 把对象的地址作为方法的实参进行传递,
结论三:在方法里面访问其他成员,都是通过-》this指针来调用的
9.类实例化对象
1给对象开辟空间
2调用合适的构造函数
对象的构造函数和析构函数
1构造函数: 对对象内存进行初始化
2析构函数: 对象内存释放之前,把占用的其它系统资源释放掉;
3构造函数和析构函数的名字必须和类的名字一样,不能随便取名字,
4构造函数和析构函数没有返回值
5析构函数不能带有参数的,因此析构函数只有一个,而构造函数可以带任意参数,所以可以重载。
6构造函数和析构函数名字必须和类名一样,不能随便取名字,析构函数名前加~
7当类里面,没有任何构造函数时,编译器或给当前类产生一个默认的构造函数和析构函数(默认的是不带任何参数,而且函数什么也不做,就是个空函数)
8定义默认构造的对象,不要在对象名字后面加一个();
问题一:构造函数是不是给对象开辟内存的?
答:对象的内存是由系统来开辟的,构造函数只能做内存的初始化,构造函数用完了,我们就说对象产生了
问题二:析构函数是不是给对象释放内存呢?
是在 对象释放之前,把对象占用的其他资源先释放掉;
9构造函数和析构函数调用的顺序是相反的。
四.拷贝构造函数:
场景:同类型一个已经存在的对象构造新的对象的时候,就会调用拷贝构造函数
结论:1当类里面没有提供一个拷贝构造函数时,编译器会产生一个默认的拷贝构造函数,这个函数默认在做内存拷贝,
结论2当对象浅拷贝出错,一定要提供自定义的拷贝构造函数
五:赋值运算符的重载函数operator=
场景:两个已经存在的对象复制的时候,会调用该函数
结论一:当两个类里面没有提供赋值运算符的重载函数的时候,编译器会产生一个默认的赋值运算重载函数,这个函数默认做内存赋值
六:类的组合关系:
组合:一个类定义的对象作为另外一个类的成员变量,这两个类之间的关系称作组合关系:一般满足 a part of..... 一部分关系
七.对象构造函数的初始化列表:
如果想在对象成员变量初始化的时候,指定成员变量的初始化方式;那么应该在构造函数的初始化列表中指定
六.代码例子
//顺序栈
const int STACK_SIZE= 10;
class SqStack
{
public:
SqStack()
{
cout << "SqStack" << endl;
mtop = -1;
mstack = new int[SCHAR_MAX];
}
~SqStack()
{
cout << "~SqStack" << endl;
delete[]mstack;
}
void Init();
void Push(int val);
void Pop();
void relaes()
{
delete[]mstack;
}
bool empty()
{
return mtop == -1;
}
bool full()
{
return mtop == STACK_SIZE - 1;
}
int top()
{
if (empty())
{
throw "stack is empty";
}
int n = mstack[mtop];
return n;
}
private:
int *mstack;
int mtop;
};
void SqStack::Init()
{
mtop = -1;
mstack =new int[STACK_SIZE];
}
void SqStack::Push(int val)
{
if (full())
{
return;
}
mstack[++mtop] = val;
}
void SqStack::Pop()
{
if (empty())
{
return;
}
--mtop;
}
int main()
{
SqStack stack1;
stack1.Init ();
stack1.Push(20);
stack1.Push(120);
stack1.Push(220);
stack1.Push(420);
stack1.Push(520);
while (!stack1.empty())
{
int val = stack1.top();
cout << val << " ";
stack1.Pop();
}
}
// 定义一个类
#if 0
const int MAX_LEN = 20;
class CGoods
{ //实体的行为定义为公有的,成员方法
public:
void IintGoods(char *n, int a,double p);
void show();
void setName(char *n)
{
strcpy_s(name, n);
}
void setAmount(int a)
{
amout = a;
}
void setPrice(double p)
{
price = p;
}
char *getName()
{
return name;
}
int getAmout()
{
return amout;
}
double getPrice()
{
return price;
}
//实体的属性一般定义为私有 称为成员变量
private:
char name[MAX_LEN];
int amout ;
double price;
};
void CGoods::IintGoods(char *n, int a, double p)
{
strcpy_s(name, n);
amout = a;
price = p;
}
void CGoods::show()
{
cout << name << endl;
cout << amout << endl;
cout << price << endl;
}
int main()
{
CGoods good1;
good1.IintGoods("bai", 20, 80.0);
good1.show();
good1.setAmount(200.0);
good1.show();
cout << good1.getName() << endl;
good1.setName("nihao ");
good1.show();
return 0;
}