C++类和对象以及析,构构造函数及拷贝构造函数

 名字空间作用域 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创建累的目的,是用来抽象实体的类型,从实体的属性和行为两方面,得到的成员变量的和成员方法,因为类是的实体类型的抽象,所以不占内存空间;

2structclass都可以定义类,不同的是,在没有限定符的情况子下,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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值