C++学习_类和对象

类和对象

一般类的头文件名称和类名相同(见名知意)
C++的作用域有四种:全局,局部,命名空间,类域。
C++中类可以实现封装,所谓封装,就是隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合的一种机制。

一。两对比较写在前面

C++中class和struct的区别?
1>
class中成员的默认访问属性为private
struct中成员的默认访问属性为public(为了向下兼容C)

2> 默认的继承访问权限。struct是public的,class是private

C语言和C++语言的struct的区别?
1> C语言的struct中不可以定义函数,而C++可以
2>在定义变量的时候,C++语言必须要带上struct,而C++不需要

struct test
{}
int main()
{
    struct test t1;//c语言定义结构体类型变量的方式
    test t1;//c++语言定义结构体类型变量的方式
}
二。怎样修改类中访问属性为public/private的成员变量?

1> 利用类中所给的方法(成员函数)
2>利用指针强大的能力
步骤如下

    1. 得到对象的起始地址pth
    2. 将pth + 偏移量 赋给指针,即等价于得到了被保护/私有成员对象的地址      (偏移量为私有成员/被保护成员的距开始地址的偏移量)
    3.  既然已经拿到了目标地址,那么直接对这块地址解引用然后更改数据即可

3> 构造另一个对象,将源对象拷贝到新对象中,在新对象中更改信息后,再想办法将数据拷贝回去(未测)

若类中成员和成员函数的参数名重名,则优先访问参数(已测)
而我们为了避免重名,往往在成员名前加”m_” / “_”。eg:char *m_name;

三。C++对象的内存模型

类是创建对象的模板,不占用内存空间,不存在于编译后的可执行文件中;而对象是实实在在的数据,需要内存来存储。对象被创建时会在栈区或者堆区分配内存。

编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段函数代码
对象内存模型

成员变量在堆区或栈区分配内存,成员函数在代码区分配内存。

事实证明,sizeof(对象名)的大小只包含了成员变量的大小,即对象所占用的内存只包含了成员变量。不过这里要注意这里也存在和struct类似的内存对齐的问题。

四。类域

每个类都会定义它自己的作用域。在类的作用域之外,普通的成员只能通过对象(可以是对象本身,也可以是对象指针或对象引用)来访问,静态成员(由static修饰)既可以通过对象访问,又可以通过类访问,而 typedef 定义的类型只能通过类来访问。

定义在类外部的成员

一个类就是一个作用域的事实能够很好的解释为什么我们在类的外部定义成员函数时必须同时提供类名和函数名。在类的外部,类内部成员的名字是不可见的。

一旦遇到类名,定义的剩余部分就在类的作用域之内了,这里的剩余部分包括参数列表和函数体。结果就是,我们可以直接使用类的其他成员而无需再次授权了。
eg:

#include<iostream>
using namespace std;

class A{
public:
typedef char* PCHAR;
public:
void show(PCHAR str);
private:
int n;
};
void A::show(PCHAR str){
cout<<str<<endl;
n = 10;
}

int main(){
A obj;
obj.show("hello world\n");

return 0;
}

我们在定义 show() 函数时用到了类 A 中定义的一种类型 PCHAR,因为前面已经指明了当前正位于 A 类的作用域中,所以不用再使用A::PCHAR这样的冗余形式。同理,编译器也知道函数体中用到的变量 n 也位于 A 类的作用域。

另一方面,函数的返回值类型出现在函数名之前,当成员函数定义在类的外部时,返回值类型中使用的名字都位于类的作用域之外,此时必须指明该名字是哪个类的成员。修改上面的 show() 函数,让它的返回值类型为 PCHAR

PCHAR A::show(PCHAR str){
cout<<str<<endl;
n = 10;
return str;
}

这种写法是错误的。因为返回值类型 PCHAR 出现在类名之前,所以事实上它是位于 A 类的作用域之外的。这种情况下要想使用 PCHAR 作为返回值类型,就必须指明哪个类定义了它,正确的写法如下所示:

A::PCHAR A::show(PCHAR str){
cout<<str<<endl;
n = 10;
return str;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值