admin管理员组文章数量:1027565
【C++篇】类和对象(上)
类的本质是封装 ,相比c语言,c语言的数据和方法都是分离的,c++把数据和方法都放到了类里面
类的定义格式:
代码语言:javascript代码运行次数:0运行复制class Stack//定义一个栈
{
private:
void Init(int capacity=4)
{
_array=(int*)malloc(sizeof(int)*capacity);
assert(_array);
_capacity=capacity;
_top=0;
}
public:
int*_array;
size_t _capacity;
size_t _top;
}
内敛函数:
class为定义类的关键字,Stack为类的名字,{}中为类的主体
类中的内容:类的成员
类中变量:成员变量,一般为了却分成员变量,会在变量名前加一个特殊标识符
类中可以定义函数,称为成员函数
定义在类里面的成员函数默认为内敛函数
类与struct的区别:
- 类中内容称为类的成员,类中的变量称为类的成员变量或者类的属性
- 类中可以定义函数,类中的函数称为类的方法或者类的成员函数
- 用栈来举例,结构体中放的只是我们需要的数据,方法是单独写的,但是在类中我们把这些都放在了class的主体中了
- 类可以直接使用类名,不需要使用typedef来重命名。(类名就是类型)
类的访问权限:
public,后面的内容为共有
private/protected,后面内容为私有
代码语言:javascript代码运行次数:0运行复制class Stack
{
piblic:
void Init(int n=4)//给栈初始化
{
....
}
void push(int x)//入栈
{
...
}
private:
int *array;
size_t capacity;
size_t top;
}
一般成员函数是公有的,成员变量是私有的。
访问权限的范围,比如上面public,从“:”开始,一直到private ,也就是从自身到下一个访问限定符,如果只有一个访问限定符,那么就是直接到“}”结束。
在class中,如果没给出访问限定符,那么默认是私有
在类中,不管是私有还是公有,都是能访问的
在c++中,struct也可用来定义类,当struct中没有给出访问限定符时,默认是公有
c++struct的用法兼容c
类域:
域的作用是影响编译器的查找,做到名字的隔离
会影响到编译器的查找,如果不指定类域,编译器在编译时将不会访问类域
类的实例化:
类是没有被分配空间的,只有类实例化出的对象才会被分配空间
类就像一个房子的设计图,告诉了我们房子的样式,但不能住人,换类来说就是不能存数据,只有类实例化出的对象才能存数据
一个类可以实例化多个对象
代码语言:javascript代码运行次数:0运行复制class Data
{
private://这是声明
int _year;
int _month;
int _day;
};
int main()
{
//这是类定义一个对象,也叫类实例化出对象
Data d1;
Data d2;
}
//类与对象的关系:1对多,一个类可以实例化出多个对象。
对象大小:
类实例化出的对象也是有大小的。
类实例化出的对象只会在对象中存储类中的成员变量,不会存储成员函数。因为存储成员函数是没必要的,我们每次调用的成员函数都是同一个,他们唯一的区别就是在调用函数时传入的数据不同。如果我们非要在对象中存储成员函数,那么存储的是成员函数的指针,我们每实例化一个对象,就得存储一次指针,存储100个,就得存储100个指针,但是这些个空间是完全没必要的,是一种空间的浪费。
计算对象的大小时,也存在内存对齐(与结构体一样):
- 第⼀个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
- 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。
- VS中默认的对⻬数为8
- 结构体总大小为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};
计算A实例化对象的大小
A中,存在两个成员变量 ch 与i
_ch是char类型,又是第一个元素,那么它放在偏移量为0的地址出,占1字节
class B
{
public:
void Print()
{
//...
}
};
计算B实例化对象的大小
因为实例化对象中,只会存储成员变量,该代码中没有成员变量,所以实例化出的对象大小为1字节,着一个字节是用来占位的,表示对象存在过,无其他意义。
代码语言:javascript代码运行次数:0运行复制class C
{};
计算C实例化对象的大小
这段代码与上述的B一样。
this 指针:
在d1 、d2调用方法时,编译器是怎么知道方法应该访问d1还是d2?
编译器编译后,类的成员函数都会默认在形参的第一位置,增加一个当前类类型的指针叫做this。
类的成员函数访问成员变量,本质是通过this指针来访问的。
c++规定,不能在形参实参的位置显示写this指针,但可以在函数体内显示的使用this指针。
代码语言:javascript代码运行次数:0运行复制class Data
{
public:
void Init(int year,int month,int day)//Init(Data*this.....)
{
_year = year;
_month = month;
_day = day;
}
void Print()//Print(Data*this)
{
//cout << this->_year << '/' <<this-> _month << '/' << this->_day << endl;
cout << _year << '/' << _month << '/' << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Data d1;
Data d2;
//d1.Init(&d1,2024,2,3);
//d2.Init(&d2,2024,3,1);
d1.Init(2024,2,3);
d2.Init(2024,3,1);
//d1.Print(&d1)
//d2.Print(&d2)
d1.Print();
d2.Print();
return 0;
}
如果我们要让this指针指向对象的值无法被修改,我们可以用const来修饰this。
代码语言:javascript代码运行次数:0运行复制class Test
{
public:
Test()
{
a = 10;
}
int get_val()const//
{
this->a = 20;//这里编译器会报错,因为this指针被const修饰,无法通过this指针
return a;
}
private:
int a;
};
int main()
{
Test t1;
int ret = t1.get_val();
cout << ret << endl;
return 0;
}
【C++篇】类和对象(上)
类的本质是封装 ,相比c语言,c语言的数据和方法都是分离的,c++把数据和方法都放到了类里面
类的定义格式:
代码语言:javascript代码运行次数:0运行复制class Stack//定义一个栈
{
private:
void Init(int capacity=4)
{
_array=(int*)malloc(sizeof(int)*capacity);
assert(_array);
_capacity=capacity;
_top=0;
}
public:
int*_array;
size_t _capacity;
size_t _top;
}
内敛函数:
class为定义类的关键字,Stack为类的名字,{}中为类的主体
类中的内容:类的成员
类中变量:成员变量,一般为了却分成员变量,会在变量名前加一个特殊标识符
类中可以定义函数,称为成员函数
定义在类里面的成员函数默认为内敛函数
类与struct的区别:
- 类中内容称为类的成员,类中的变量称为类的成员变量或者类的属性
- 类中可以定义函数,类中的函数称为类的方法或者类的成员函数
- 用栈来举例,结构体中放的只是我们需要的数据,方法是单独写的,但是在类中我们把这些都放在了class的主体中了
- 类可以直接使用类名,不需要使用typedef来重命名。(类名就是类型)
类的访问权限:
public,后面的内容为共有
private/protected,后面内容为私有
代码语言:javascript代码运行次数:0运行复制class Stack
{
piblic:
void Init(int n=4)//给栈初始化
{
....
}
void push(int x)//入栈
{
...
}
private:
int *array;
size_t capacity;
size_t top;
}
一般成员函数是公有的,成员变量是私有的。
访问权限的范围,比如上面public,从“:”开始,一直到private ,也就是从自身到下一个访问限定符,如果只有一个访问限定符,那么就是直接到“}”结束。
在class中,如果没给出访问限定符,那么默认是私有
在类中,不管是私有还是公有,都是能访问的
在c++中,struct也可用来定义类,当struct中没有给出访问限定符时,默认是公有
c++struct的用法兼容c
类域:
域的作用是影响编译器的查找,做到名字的隔离
会影响到编译器的查找,如果不指定类域,编译器在编译时将不会访问类域
类的实例化:
类是没有被分配空间的,只有类实例化出的对象才会被分配空间
类就像一个房子的设计图,告诉了我们房子的样式,但不能住人,换类来说就是不能存数据,只有类实例化出的对象才能存数据
一个类可以实例化多个对象
代码语言:javascript代码运行次数:0运行复制class Data
{
private://这是声明
int _year;
int _month;
int _day;
};
int main()
{
//这是类定义一个对象,也叫类实例化出对象
Data d1;
Data d2;
}
//类与对象的关系:1对多,一个类可以实例化出多个对象。
对象大小:
类实例化出的对象也是有大小的。
类实例化出的对象只会在对象中存储类中的成员变量,不会存储成员函数。因为存储成员函数是没必要的,我们每次调用的成员函数都是同一个,他们唯一的区别就是在调用函数时传入的数据不同。如果我们非要在对象中存储成员函数,那么存储的是成员函数的指针,我们每实例化一个对象,就得存储一次指针,存储100个,就得存储100个指针,但是这些个空间是完全没必要的,是一种空间的浪费。
计算对象的大小时,也存在内存对齐(与结构体一样):
- 第⼀个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
- 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。
- VS中默认的对⻬数为8
- 结构体总大小为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};
计算A实例化对象的大小
A中,存在两个成员变量 ch 与i
_ch是char类型,又是第一个元素,那么它放在偏移量为0的地址出,占1字节
class B
{
public:
void Print()
{
//...
}
};
计算B实例化对象的大小
因为实例化对象中,只会存储成员变量,该代码中没有成员变量,所以实例化出的对象大小为1字节,着一个字节是用来占位的,表示对象存在过,无其他意义。
代码语言:javascript代码运行次数:0运行复制class C
{};
计算C实例化对象的大小
这段代码与上述的B一样。
this 指针:
在d1 、d2调用方法时,编译器是怎么知道方法应该访问d1还是d2?
编译器编译后,类的成员函数都会默认在形参的第一位置,增加一个当前类类型的指针叫做this。
类的成员函数访问成员变量,本质是通过this指针来访问的。
c++规定,不能在形参实参的位置显示写this指针,但可以在函数体内显示的使用this指针。
代码语言:javascript代码运行次数:0运行复制class Data
{
public:
void Init(int year,int month,int day)//Init(Data*this.....)
{
_year = year;
_month = month;
_day = day;
}
void Print()//Print(Data*this)
{
//cout << this->_year << '/' <<this-> _month << '/' << this->_day << endl;
cout << _year << '/' << _month << '/' << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Data d1;
Data d2;
//d1.Init(&d1,2024,2,3);
//d2.Init(&d2,2024,3,1);
d1.Init(2024,2,3);
d2.Init(2024,3,1);
//d1.Print(&d1)
//d2.Print(&d2)
d1.Print();
d2.Print();
return 0;
}
如果我们要让this指针指向对象的值无法被修改,我们可以用const来修饰this。
代码语言:javascript代码运行次数:0运行复制class Test
{
public:
Test()
{
a = 10;
}
int get_val()const//
{
this->a = 20;//这里编译器会报错,因为this指针被const修饰,无法通过this指针
return a;
}
private:
int a;
};
int main()
{
Test t1;
int ret = t1.get_val();
cout << ret << endl;
return 0;
}
本文标签: C篇类和对象(上)
版权声明:本文标题:【C++篇】类和对象(上) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747408117a2164897.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论