.net网站开发全过程网站域名做301
news/
2025/9/27 22:21:56/
文章来源:
.net网站开发全过程,网站域名做301,介绍好的免费网站模板下载,东莞网站关键字目录
初始化列表
static成员
C11对于非静态成员变量初始化
友元
友元函数
友元类
总结 初始化列表 我们知道#xff0c;在学习构造函数时#xff0c;我们知道对象的成员变量的初始化我们是在构造函数函数体内进行初始化的#xff0c;还有没有其它初始化成员变量的方…目录
初始化列表
static成员
C11对于非静态成员变量初始化
友元
友元函数
友元类
总结 初始化列表 我们知道在学习构造函数时我们知道对象的成员变量的初始化我们是在构造函数函数体内进行初始化的还有没有其它初始化成员变量的方法呢 初始化列表就是我们要学习的第二个初始化的方法。 在学习初始化列表之前我们先对以往的在构造函数内部对成员变量进行初始化的操作进行分析我们直接给出结论我们称在类内部的成员变量只是对成员变量进行了声明而没有进行定义如图所示 我们在日期类内部声明了三个成员变量_year,_month,_day,切记这里只是对三个成员变量进行了声明成员变量的定义分为两种情况 1.如果我们在构造函数体内进行成员变量的初始化操作那么在进行初始化时成员变量已经完成了定义函数体内只是在进行进行变量的赋值而已。因此就这一现象我们不难产生疑问如果在函数体内对成员变量进行赋值时此时变量已经完成了定义此时的赋值操作就相当于是在成员变量定义之后才对成员变量进行了初始化操作那么对于const成员变量引用成员变量没有默认构造函数的自定义成员变量这些在定义时必须初始化的成员变量还能用这种初始化方式进行初始化吗当然不行此时我们就得用第二种方式进行成员变量的初始化操作。 2.如果我们使用初始化列表进行成员变量的初始化操作就相当于是在变量定义时对成员变量进行了初始化操作这对于上述三种必须在定义时就必须进行初始化的成员变量而言是可行的。 相关示例代码如下
class A {public:A(int a){_a a;}
private:int _a;
};
class Date {public:Date(int year,int month,int day,int A):_year(year),_month(month),_day(day),_a(10),a(A),_aa(10){}
private:int _year;int _month;int _day;const int _a;int a;A _aa;
}; 重点对于自定义类型而言还有一个要注意的问题当自定义类型成员变量没有默认的构造函数时我们必须在定义时进行初始化所以我们必须用初始化列表对其进行初始化。但是当自定义类型成员变量有默认的构造函数时我们在定义时可以不用初始化在定义之后初始化也可以也就意味着有了默认构造函数的成员变量可以在构造函数的函数体内进行初始化。但是当我们在构造函数体内对有默认构造函数的成员变量初始化时编译器同时也默认生成了初始化列表调用了自定义成员变量的默认构造函数对其进行了初始化。所以就会存在不管自定义类型的成员变量是否存在默认的构造函数我们都会生成初始化列表对自定义类型成员变量进行初始化所以我们干脆让其都在初始化列表中初始化没有默认构造函数我们自己生成初始化列表为其初始化有默认构造函数编译器帮助我们自动生成初始化列表完成初始化。 总结对于内置类型的成员变量和自定义类型成员变量有默认构造函数在构造函数体内部和初始化列表中都可以进行初始化操作对于const成员变量引用成员变量自定义类型成员变量没有默认构造函数我们在初始化列表中完成初始化为了统一我们规定所有的成员变量都在初始化列表中进行初始化。 static成员 之前我们也学习过static关键字我们知道static可以改变变量的声明周期比如可以在局部变量之前加上static从而使局部变量拥有了和全局变量一样的生命周期在C也有static关键字那么它的作用是什么呢 其实C中的static关键字的作用和我们之前学习的是一样的同样也可以改变变量的生命周期可以是成员变量的周期使之属于类及所有的对象生命周期在整个程序运行期间。 先看如下代码,当静态成员变量为public时
class A {
public:static int _c;A(int a1) {_a a;}
private:int _a;
};
//静态成员变量必须在类外进行定义初始化
int A::_c 1;int main()
{//再类外实现对静态成员变量的访问当静态成员变量为pulbic时A a;cout a._c endl;cout A::_c endl;return 0;
}解析静态成员变量必须在类外进行定义初始化。当静态成员变量为public修饰时我们在类外进行访问可以通过对象.类::方式去访问。 当静态成员变量用private修饰时在类外肯定是不能访问的所以我们必须在类内提供公共的接口去访问先看下列代码
class A {
public:A(int a1) {_a a;}//提供公共的接口普通的成员函数void print(){cout _c endl;}//提供公共的接口static静态成员函数,但是static静态成员函数没有this指针所以不能访问非静态成员变量只能访问静态成员变量和成员函数static void print1(){cout _c endl;}
private:int _a;static int _c;
};int A::_c 3;int main()
{//在类外实现对静态成员变量的访问当静态成员变量为private时A a;//1.通过对象.的方式去访问a.print();//2.通过类::方式去访问A::print1();return 0;
} 解析如果是private修饰的静态成员变量我们在类外可以通过公共的接口即普通的成员函数和静态的成员函数进行访问但是静态的成员函数因为没有隐藏的this指针所以只能访问静态成员变量和成员函数不能访问非静态成员变量。 总而言之静态的成员函数和成员变量都属于整个类和所有对象都可以可以使用对象.和类::的方式去访问。
C11对于非静态成员变量初始化
我们在学习构造函数时我们学写了编译器生成的默认构造函数我们知道默认构造函数对于内置类型是不做初始化处理的只对自定义类型进行初始化处理为了改善这种情况C11发明了一种新的语法。就是给非静态成员变量声明时顺便给予缺省值。
相关代码如下
class A
{
public:void print(){cout a endl;}
private:int a 10;int* p (int*) malloc(40);
};int main()
{A a;a.print();}
整个过程就相当于是给自定义类型给予了缺省值当构造函数的初始化列表没有给内置类型赋初始值时就会使用这个初始值。
运行截图如下我们发现内置类型确实使用了此缺省值。 友元 友元的概念友元是一种允许非类成员函数访问类的非公友成员的一种机制友元可以是函数或者类通过在类中用关键字friend说明该函数或者类使得函数或者类获得其私有和保护成员的访问权限在函数体中访问对象的成员必须用对象.的方式访问。 友元函数
直接看代码
class B {friend void print(B b);
private:int _b666;
};void print (B b) {cout b._b endl;}
int main()
{B b;print(b);
} 运行截图如下 注意 1.友元函数可以访问类的私有和保护成员但是它不是成员函数。 2.注意const不能修饰友元函数因为友元函数不是成员函数const只能修饰成员 函数。 3.友元函数就是一种普通的函数用一般函数调用的方式调用即可。 友元类
直接看代码
class B {friend class A;
private:int _b888;
};class A
{
public:void print(){cout b._b endl;}private:int _a 10;B b;
};int main()
{A a;a.print();}
再类B中直接声明类A是类B的友元类那么类A就可以访问类B的非公有成员运行截图如下 注意 1.友元类不具有交换性声明类A是类B的友元但此时类B不一定是类A的友元只有声明了类B时类A的友元类之后两者才可以互相访问彼此的非公有成员。 2.友元类的所有成员函数都是另一个类的友元函数都可以访问另一个类的非公有成员。 总结 到了这里类和对象的学习我们就可以告一段落了类和对象细小的知识点太多但是这些细小的知识点便是C学习的精髓所在望小伙伴们可以反复观看 本期内容到此结束^_^
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920017.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!