其實一直沒有系統的學習過c++,就開始擼代碼了。正好公司另外一位原來純c的小夥伴想學習c++,共同學習吧,把這兩天學到的東西鞏固下。
友元
其實說實話在前天我都不知道還有這個東西。百度了一下:
友元函數是能夠訪問類中的私有成員的非成員函數。友元函數從語法上看,它與普通函數一樣,即在定義上和調用上與普通函數一樣。
友元關係不具對稱性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元關係不具傳遞性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。
作用及特點
友元提供了不同類的成員函數之間、類的成員函數與一般函數之間進行數據共享的機制。通過友元,一個不同函數或另一個類中的成員函數可以訪問類中的私有成員和保護成員。c++中的友元爲封裝隱藏這堵不透明的牆開了一個小孔,外界可以通過這個小孔窺視內部的祕密。
友元的正確使用能提高程序的運行效率,但同時也破壞了類的封裝性和數據的隱藏性,導致程序可維護性變差。
這是在百度百科上面的解釋。
#include<iostream>
#include<cmath>
using namespace std;
class Point
{
public:
Point(double xx, double yy)
{
x = xx;
y = yy;
};
void Getxy();
friend double Distance(Point &a, Point &b);
private:
double x, y;
};
void Point::Getxy()
{
cout << "(" << x << "," << y << ")" << endl;
}
double Distance(Point &a, Point &b)
{
double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx*dx + dy*dy);
}
int main(void)
{
Point p1(3.0, 4.0), p2(6.0, 8.0);
p1.Getxy();
p2.Getxy();
double d = Distance(p1, p2);
cout << "Distance is" << d << endl;
return 0;
}
這是百度上面的例子。
我自己的理解是這樣的:友元可以直接訪問某個對象的私有的成員。(等於是開啓了上帝模式?),在類之外還開闢了一條路,但是又不像public那麼開放,誰都可以進行讀寫。自覺這個特性比較尷尬。
這是過了幾天更新的,真是打自己臉
正好用到了友元,所以來更新一發,一般程序的一些比較重要的變量都會讀出來提供給全局,但是前段時間因爲類之間的權限的問題跟軟件開發的便捷的問題上我犯起了糾結,一開始的方案想的是
聲明一個靜態類,變量全部放在public裏面的話,全局都可以調用,但是全局可以修改,不合適。如果放做private再加個public的get的話,不加public的set的話,就是全局可讀但是誰都不能修改。加public的set的話就跟pubilc的全局變量一樣了。說的有點亂。
如果加上友元的話 就不一樣了
在允許修改全局變量的地方添加友元,其他的地方只需要提供一個public的get就可以了。我先試試,這樣應該就問題不大了。
買表 static 跟friend 不能一起用
auto
自動推導參數的類型。可以
auto a = 1;
auto b = "string";
auto c = 1.11;
自動推導類型,聽起來灰常牛逼,等在項目中使用了再說。
智能指針:
unique_ptr
share_ptr
weak_ptr
unique_ptr :感覺這個類似於垃圾回收機制,c#中的arc之類的,自動進行釋放,這個指針不能進行賦值,可以使用move函數轉移給其他指針,
share_ptr:可以同時又多個指針指向某一塊地址,並且開始使用引用計數。
weak_ptr:配合share_ptr使用,可以用lock函數獲取到share_ptr的內容,但是不增加引用計數。
先寫到這兒吧,邊理解邊寫,加油。
如果那又有錯誤,有勞指教。謝謝!