C++中关于静态成员/函数的问题

-:静态成员

	静态成员函数或者是静态成员,其都是属于类的;而不是属于类的对象的。然后因为静态成员是不与任何对象绑定
在一块的,所以静态成员函数不包括this指针的。因此静态成员函数是不能声明成const的,而且我们也不能在static
函数体内使用this指针。这一限制既适用于this的显示使用,也对调用非静态成员的隐式使用有效。(也就是说,静态成
员函数是不可以调用普通的成员函数的,也不可以调用普通的成员的。只能调用静态的成员或者静态成员函数)。
	我们使用作用域运算符直接访问静态成员:
		class A{
		public:
			void calculate(){amount += amount*interestRate;}
			static double rate(){return interestRate;}
			static void rate(double);
		private:
			std::string owner;
			double amount;
			static double interestRate;
			static double initRate();
		};
		double r;
		r = A::rate();		//使用作用域运算符访问静态成员
	

二:定义和初始化静态成员

	和其他成员函数一样,我们既可以在了类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态成员时,不能重复static
关键字,该关键字只能出现在类内部的声明语句:
			void A::rate(double newRate){
				interestRate = newRate;
			}
注意:和类的所有成员一样,当我们指向类外部的静态成员时,必须指明成员所属的类名。static关键字则只出现在类内部的声明语句中。
	因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的。这意味着他们不是由类的构造函数初始
化的。而且一般来说,我们不能在类的内部初始化静态成员。相反的,必须在类的外部定义和初始化每个静态成员。和其他对象一样,一
个静态数据成员只能定义一次。
	我们定义静态数据成员的方式和在类的外部定义成员函数差不多。我们需要指定对象的类型名,然后是类名,作用域运算符以及成
员自己的名字:
			//定义并初始化一个静态成员
			double A::interestRate = initRate();
这条语句定义了名为interesRate的对象,该对象是A的静态成员,其类型是double。从类名开始。这条定义语句的剩余部分就都位于
类的作用域之内了。因此,我们可以直接使用initRate函数。虽然其是私有的成员函数。
	通常情况下,类的静态成员不应该在类的内部初始化。然而,我们可以为静态成员提供const整数累的类内初始值,不过要求静
态成员必须是字面值常量类型的constexpr。初始值必须是常量表达式,因为这些成员本身就是常量表达式,所以它们能用在所有
适合于常量表达式的地方。
			class A{
			public:
				static double rate(){return interestRate;}
				static void rate(double);
			private:
				static constexpr int period = 30;//period是常量表达式
				double daily_tbl[period];
			};
注意:类的静态成员一定要初始化!!!!!

三:初始化静态成员函数指针:

			void number(int n){
				return n;
			}
			class B{
			public:
				static void (*p)(int number);
				.....
			};
			void (*B::p)(int number) = number;
注意:所有的静态成员一定要初始化,而且注意这个函数指针初始化的形式void (*B::p)(int number)

四:如果出现你调用的静态成员函数出现如下错误:

undefined reference to `linkedBinaryTree<booster>::visit'

这种情况下就是表示你没有对你的静态成员函数进行初始化,所以你必须对静态成员函数进行初始化!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值