青岛网络推广建站资源网站快速优化排名
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:56
当前位置: 首页 > news >正文
青岛网络推广建站,资源网站快速优化排名,有一台服务器怎么赚钱,网站开发相关外文书籍前言#xff1a;在类和对象中#xff0c;我们走过了十分漫长的道路#xff0c;今天我们将进一步学习类和对象#xff0c;类和对象这块荆棘地很长#xff0c;各位一起加油呀。 #x1f496; 博主CSDN主页:卫卫卫的个人主页 #x1f49e; #x1f449; 专栏分类:高质量在类和对象中我们走过了十分漫长的道路今天我们将进一步学习类和对象类和对象这块荆棘地很长各位一起加油呀。 博主CSDN主页:卫卫卫的个人主页 专栏分类:高质量学习 代码仓库:卫卫周大胖的学习日记 关注博主和博主一起学习!一起努力 目录标题 类和对象const修饰成员函数再谈构造函数之函数体赋值explict关键字static成员 类和对象
const修饰成员函数
在C中可以使用const关键字来修饰成员函数。const修饰符可以被应用于类的成员函数这表示该函数不会修改任何类的成员变量。
当一个成员函数被const修饰时它被称为常量成员函数。常量成员函数承诺不会修改任何成员变量。常量成员函数的定义和声明都必须包含const关键字。 语法格式
返回类型 类名::函数名const
{//函数体……
}下面是一个示例
class MyClass
{
public:void nonConstFunction(int year,int month ,int day); // 非常量成员函数 void nonConstFunction() const; // 常量成员函数
private:int _day;int _month;int _year;
};void MyClass::nonConstFunction(int year 1,int month 1 ,int day 1)
{// 对成员变量进行修改_year year;_month month;_day day;
}void MyClass::nonConstFunction() const
{// 不对成员变量进行修改cout year: _year month: _month day: _day endl;
}
在上面的示例中nonConstFunction是一个非常量成员函数可以修改成员变量。而nonConstFunction的const版本是一个常量成员函数不会修改成员变量。
那我们思考一下为什么在上面这个示例中const修饰了以后就无法对里面的成员变量进行修改了请看下图 在上图中我们可以知道编译器会对this指针加上const进行修饰让外部变量无法对其修改 如果在上面式子中我们对const修饰的成员函数中的成员变量进行修改就会出现如下情况如下所示 使用const修饰常量成员函数的好处是可以在常量对象上调用该函数而不会导致编译错误。这样可以提高代码的可读性和安全性。 注意事项: C中const成员函数有以下限制 const成员函数不能修改类的非静态数据成员。这是因为const成员函数保证不会修改对象的状态所以不能修改任何非静态数据成员。 const成员函数只能调用其他const成员函数。这是因为const成员函数保证不会修改对象的状态所以只能调用其他也不会修改对象状态的const成员函数。 const成员函数不能通过指针或引用返回非const指针或引用。这是因为const成员函数要保证不会修改对象的状态所以不能返回非const指针或引用否则调用者就可以通过这个指针或引用修改对象的状态。 const成员函数可以被非const对象和const对象调用。非const对象调用const成员函数时会被自动转换为const对象。 const成员函数不能被声明为虚函数。虚函数是根据对象的动态类型来调用的而const成员函数是根据对象的静态类型来调用的所以不能将const成员函数声明为虚函数。 再谈构造函数之函数体赋值
在创建对象时编译器通过调用构造函数给对象中各个成员变量一个合适的初始值。
class Date
{
public:Date(int year, int month, int day){_year year;_month month;_day day;}
private:int _year;int _month;int _day;
};虽然上述构造函数调用之后对象中已经有了一个初始值但是不能将其称为对对象中成员变量的初始化构造函数体中的语句只能将其称为赋初值而不能称作初始化。因为初始化只能初始化一次而构造函数体内可以多次赋值。
. 初始化列表构造函数可以通过初始化列表来初始化成员变量。在构造函数的参数列表后面使用冒号:来定义初始化列表然后通过成员变量名称和初始值来初始化成员变量(当然这个括号里面也可以写一个有返回值的表达式)。例如 注意
每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)类中包含以下成员必须放在初始化列表位置进行初始化 引用成员变量const成员变量自定义类型成员(该类没有默认构造函数)
实例演示
class A
{
public:A(int a):_a(a){cout _a: _a endl;}
private:int _a;
};class d
{
public:d(int a, int b, int c):_aa(a),_b(b),_c©{cout _b: _b endl;cout _c: _c endl;}private:A _aa;//自定义变量int _b;//引用const int _c;//const
};int main()
{d d1(10, 20, 30);return 0;
}尽量使用初始化列表初始化因为不管你是否使用初始化列表对于自定义类型成员变量一定会先使用初始化列表初始化。成员变量在类中声明次序就是其在初始化列表中的初始化顺序与其在初始化列表中的先后次序无关 在C中构造函数体赋值的注意事项如下 初始化列表的优先级高于构造函数体内的赋值如果同时在初始化列表和构造函数体内对成员变量进行赋值初始化列表中的赋值操作会先于构造函数体内的赋值操作执行。 成员变量的声明顺序决定了初始化的顺序成员变量在类中的声明顺序决定了它们初始化的顺序。在构造函数体内的赋值操作也会按照成员变量的声明顺序进行。 成员变量的初始化顺序与初始化列表中的顺序一致在初始化列表中的顺序决定了成员变量初始化的顺序。如果在初始化列表中没有给出某个成员变量的初始值该成员变量会按照默认构造函数进行初始化。 常量成员变量必须在初始化列表中进行初始化对于类中的常量成员变量const类型它们必须在初始化列表中进行初始化而不能在构造函数体内进行赋值操作。 使用成员初始化列表可以提高效率使用成员初始化列表可以在对象构造时直接进行赋值操作避免了先构造默认对象再赋值的额外开销因此可以提高效率。
总体而言通过初始化列表进行成员变量的赋值是更好的选择除非有特殊需要如需要在构造函数体内做其他逻辑处理才使用构造函数体内的赋值语句。 explict关键字
在C中explicit也是一个关键字但其使用情况与C#中的略有不同。
在C中explicit关键字可以用于单参数构造函数或转换函数以防止编译器进行隐式类型转换。默认情况下单参数构造函数可以用于隐式类型转换。但是当我们使用explicit关键字来修饰该构造函数时它将变为只能进行显式类型转换的构造函数禁止隐式转换。
下面是一个使用explicit关键字的示例
class Number {
private:int value;
public:explicit Number(int value) : value(value) {}int getValue() const {return value;}
};void printNumber(const Number number) {std::cout number.getValue() std::endl;
}int main() {int intValue 10;// 隐式类型转换不被允许// Number number intValue;// 显式类型转换Number number Number(intValue);printNumber(number);return 0;
}在上面的示例中Number类定义了一个带有单参数的构造函数并使用explicit关键字进行修饰。在main函数中我们首先声明一个int类型的变量intValue并将其赋值为10。然后我们尝试使用隐式类型转换将intValue转换为Number类型但由于Number类的构造函数使用了explicit关键字这会导致编译错误。接着我们使用显式类型转换将intValue转换为Number类型并将结果赋值给number变量。最后我们通过调用printNumber函数将number对象传递给它并输出结果。可以看到通过使用explicit关键字我们可以明确指定我们希望进行显式类型转换从而避免了隐式类型转换可能带来的意外行为。 static成员
在C中static关键字可以应用于类的成员用于指示该成员是静态的。静态成员与类的实例无关它们属于整个类而不是类的实例。以下是一些关于C中静态成员的信息
静态数据成员静态数据成员与类的所有实例共享它们只有一个副本。可以在类的内部声明并在类的外部初始化。静态数据成员必须在类的定义之外进行初始化并且必须在类的外部定义。并且静态成员变量是在初始化时分配内存的程序结束时释放内存。
class MyClass
{
public:static int staticData; // 声明静态数据成员int unstaticData 10; //声明并初始化非静态成员
};int MyClass::staticData 0; // 初始化静态数据成员int main()
{MyClass obj1;MyClass obj2;obj1.staticData 5;cout 非静态成员: obj1.unstaticData endl; //输出非静态成员cout 静态成员: obj2.staticData endl; // 输出静态成员: 5return 0;
} 静态成员函数静态成员函数没有访问类的任何实例成员的权限它们只能访问静态成员。静态成员函数可以通过类名或对象名来引用非静态成员函数只能通过对象名引用。
class MyClass
{
public:static void StaticFunction()//静态成员函数 {cout Static Function endl;}void UnstaticFunction()//非静态成员函数{cout UnStatic Function endl;}
};int main() {MyClass d1;MyClass::StaticFunction(); // 输出: Static Functiond1.UnstaticFunction(); //输出: UnStatic Functionreturn 0;
}静态成员提供了一种在类的所有实例之间共享和访问数据的方式。在某些情况下静态成员函数可以用作工具函数或全局函数的替代品。然而静态成员应谨慎使用因为它们破坏了封装性和面向对象设计的一些原则。 好啦今天的内容就到这里啦下期内容预告类和对象(五)友元、内部类、匿名对象等下期就会对类和对象进行最后的收尾了各位加油呐 结语今天的内容就到这里吧谢谢各位的观看如果有讲的不好的地方也请各位多多指出作者每一条评论都会读的谢谢各位。 ️ 这里祝各位新年快乐
- 上一篇: 青岛外贸网站建设哪家好网站建设是学哪个学科
- 下一篇: 青岛网站关键字优化成都品牌形象设计
相关文章
-
青岛外贸网站建设哪家好网站建设是学哪个学科
青岛外贸网站建设哪家好网站建设是学哪个学科
- 技术栈
- 2026年03月21日
-
青岛外贸建设网站制作虚拟机网站建设
青岛外贸建设网站制作虚拟机网站建设
- 技术栈
- 2026年03月21日
-
青岛团购网站建设如何免费申请网站域名
青岛团购网站建设如何免费申请网站域名
- 技术栈
- 2026年03月21日
-
青岛网站关键字优化成都品牌形象设计
青岛网站关键字优化成都品牌形象设计
- 技术栈
- 2026年03月21日
-
青岛网站建设 上流网站运营成本明细
青岛网站建设 上流网站运营成本明细
- 技术栈
- 2026年03月21日
-
青岛网站建设 新视点怎样创建个人网页
青岛网站建设 新视点怎样创建个人网页
- 技术栈
- 2026年03月21日






