C 从入门到起飞-初始列表&类型转换&static成员 全方位分析!
发布时间:2025-06-24 17:03:11 作者:北方职教升学中心 阅读量:486
🌈个人主页:秋风起,再归来~。
🔥#xff1系列专栏a;C++从入门到起飞。 。
🔖克心守己律己则安。
目录。
1、初始化列表。
2、 类型转换。
3. static成员。
4、完结散花。
1、初始化列表。
• 在我们实现构造函数之前,成员变量的初始化。主要使⽤。函数体内赋值。,还有构造函数的初始化⼀种⽅ 类型,就是。初始化列表。,使用初始化列表⽤⽅式是以⼀个。冒号开始。,接着是⼀以逗号分隔的数据为基础 员列表,每个"成员变量"后⾯跟。⼀个放在。括号中的初始值或表达式。。
class Date{ public: Date(int year = 10, int month = 10, int day = 10) :_year(2024)/常量 ,_month(month)//变量 ,_day(day*3+1)//表达式 { //... }private: int _year; int _month; int _day;};
• 在初始化列表中,每个成员的变量。只能出现⼀次。,语法理解。初始化列表。可以认为是。每个成员的变量定义 初始化。的地⽅。
•。 引⽤成员变量。,const成员变量。,类型变量没有默认结构。,必须放置在初始化列表的位置⾏初始 化学,否则会编译报错。。
class Time{ public: Time(int hour) :_hour(hour) { //... }private: int _hour;};class Date{ public: Date(int year = 10, int month = 10, int day = 10) :_year(2024)/常量 ,_month(month)//变量 ,_day(day*3+1)//表达式 //, _day(day)//表达式 { //... }private: int _year; int _month; int _day; int& _ra;//引用成员变量 Time _t;////类型变量没有默认结构 const int _n;//const};
• C++11⽀持有成员变量声明的位置。给缺省值。给予缺省值。,这种缺省值主要是给的。没有显⽰列表初始化。
初始化的 成员使⽤的。• 尽量使⽤初始化列表初始化,因为那些你。不在初始化列表中初始化的成员也会⾛初始化列表。,如果这 个成员在。声明位置给缺省值。,初始化列表会。⽤这种缺省值的初始化。。如果你没有给缺省值,对于。没 有显⽰内置类型成员的初始化取决于编译器。
,C++没有规定。对于没有 显⽰在初始化列表中初始化⾃会调整定义类型的成员⽤该成员类型的默认构造函数,假如没有默认结构 导致编译错误。
class Time{ public: Time(int hour) :_hour(hour) { //... }private: int _hour;};class Date{ public: Date(int year = 10, int month = 10, int day = 10,int hour) //:_year(2024)/常量 //,_month(month)//变量 //,_day(day*3+1)//表达式 //, _day(day)//表达式 :_ra(year) ,_t(hour) ,_n(24) { //... }private: int _year=2024; int _month=7; int _day=26; int& _ra;//引用成员变量 Time _t;////类型变量没有默认结构 const int _n;//const};• 根据成员变量在类中进行初始化列表。声明顺序进⾏初始化。声明顺序进⾏初始化。,跟成员在。
出现初始化列表的顺序⽆ 关。
。建议保持声明顺序和初始列表顺序⼀致。
#include<iostream>using namespace std;class A{ public: A(int a) :_a1(a) , _a2(_a1) { } void Print() { cout << _a1 << " " << _a2 << endl; }private: int _a2 = 2; int _a1 = 2;};int main(){ A aa(1); aa.Print();}。
上⾯程序的运⾏结果是什么()
A.输出1 1。
B.输出2 2 。
C.编译报错。
D.输出1 随机值。
E.输出1 2。
F.输出2 1。
根据运行结果我们知道这个问题的答案是D。2、 类型转换。• C++⽀持。内置类型。隐式类型。转换。为。类型对象。
,需要有。
参数的构造函数是相关内置类型。class A{ public: A(int a1=10,int a2=10) :_a1(a1) ,_a2(a2) { } void Print() { cout << _a1 << " " << _a2 << endl; }private: int _a1 = 10; int _a2 = 10;};int main(){ // 1构造⼀A的临时对象,再⽤这个临时对象被复制⻉构造aa3 // 编译器遇到连续结构+拷⻉构造->优化为直接结构 A aa1=1;//==A aa1(1); aa1.Print(); // C++11之后才⽀持多参数转换 A aa2 = { 1,2 };//==A aa1(1,2); aa2.Print(); return 0;}。• 构造函数前⾯加。
• 构造函数前⾯加。
explicit。就不再⽀隐式类型转换。3. static成员。• ⽤。static修改的成员变量。
,称为静态成员变量,静态成员变量⼀定要在。
类外进⾏初始化。。class A{ public: A() { ++count; } ~A() { --count; }private: static int count;};///必须在类外初始化int A::count = 0;int main(){ return 0;}。• 所有类别的对象都有静态成员变量。共享。
,不属于特定对象,没有对象,存放在静态区域。。 。• ⽤static修改的成员函数,称之为。静态成员函数。
,静态成员函数。没有this指针。。•。静态成员函数。中可以。访问。其他的。静态成员。,但是不。能访问⾮静态。
,因为。
没有this指针。 。class A{ public: A() { ++count; } ~A() { --count; } static void func() { //可以访问静态成员 cout << count << endl; //不允许访问非静态成员 //cout << a << endl; }private: static int count; int a;};///必须在类外初始化int A::count = 0;int main(){ cout << sizeof(A) << endl; return 0;}。
•。 ⾮静态成员函数,可访问任何静态成员变量和静态成员函数。。•。突破类域。就可以。访问静态成员。,可以通过。类名::静态成员。
或者。对象.静态成员。访问静态成员变量 和静态成员函数。
• 静态成员也是类成员,受。 public、protected、限制private访问限定符。。
•。
在声明位置,静态成员变量不能初始化缺省值。
,因为缺省值是构造函数初始化列表的,静态成员 变量不属于某个对象,不⾛构造函数初始化列表。
让我们看一个小练习~。
已经有A了,B,C,D4类的定义,程序中A,B,C,调整D构造函数⽤顺序为?()
已经有A了,B,C,D4类的定义,程序中A,B,C,D析构函数调⽤顺序为?()
C c;int main(){ A a; B b; static D d; return 0;}。
构造函数调用的顺序是创建对象的顺序!
分析函数调用的顺序取决于对象的生命周期,C定义全局,因此,C最终调用了分析函数,谁先定义A和B,谁先分析#xff0c;D对象为静态,在main函数结束时,调用分构函数!
最后,我们用静态成员来解决OJ问题:
描述。求1+2+3+...+n,乘除法不能用于要求,for、while、if、else、switch、关键词和条件判断句如case(A?B:C)。
#xff1的数据范围a;0<n≤200。
高级: 空间复杂度 O(1) ,时间复杂度 O(n)。示例1。
输入:5。
复制返回值:
15。示例2。
输入:1。
复制返回值:
1。
OJ链接。
解题代码: 。class Sum{ public: Sum() { ret+=i; ++i; } static int GetRet() { return ret; }private: static int i; static int ret;};///用静态成员变量记录int结果 Sum::i=1;int Sum::ret=0;class Solution { public: int Sum_Solution(int n) { //Sum a[n];变长数组 ///创建n个对象来调用n次构造函数 Sum* p=new Sum[n]; return Sum::GetRet(); }};
4、完结散花。
好了,本期分享。
好了,这一期的分享。
到此结束~。
假如这个博客对你有帮助,可以用你的小指点一个免费的赞,收藏起来哟~。